popfile-1.1.3+dfsg/0000775000175000017500000000000011710356074013351 5ustar danieldanielpopfile-1.1.3+dfsg/bayes.pl0000664000175000017500000000611311710356074015012 0ustar danieldaniel#!/usr/bin/perl # ---------------------------------------------------------------------------- # # bayes.pl --- Classify a mail message manually # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use lib defined($ENV{POPFILE_ROOT})?$ENV{POPFILE_ROOT}:'./'; use POPFile::Loader; my $code = 0; if ( $#ARGV >= 0 ) { # POPFile is actually loaded by the POPFile::Loader object which does all # the work my $POPFile = POPFile::Loader->new(); # Indicate that we should create not output on STDOUT (the POPFile # load sequence) $POPFile->debug(0); $POPFile->CORE_loader_init(); $POPFile->CORE_signals(); $POPFile->CORE_load( 1 ); $POPFile->CORE_link_components(); $POPFile->CORE_initialize(); my @files; if ($^O =~ /linux/) { @files = @ARGV[0 .. $#ARGV]; } else { @files = map { glob } @ARGV[0 .. $#ARGV]; } @ARGV = (); if ( $POPFile->CORE_config() ) { # Prevent the tool from finding another copy of POPFile running my $c = $POPFile->get_module('POPFile::Config'); my $current_piddir = $c->config_( 'piddir' ); $c->config_( 'piddir', $c->config_( 'piddir' ) . 'bayes.pl.' ); $POPFile->CORE_start(); my $b = $POPFile->get_module('Classifier::Bayes'); my $session = $b->get_session_key( 'admin', '' ); foreach my $file (@files) { if ( !(-e $file) ) { print STDERR "Error: File `$file' does not exist, classification aborted.\n"; $code = 1; last; } } if ( $code == 0 ) { foreach my $file (@files) { print "`$file' is `" . $b->classify( $session, $file ) . "'\n"; } foreach my $word (sort keys %{$b->{parser__}->{words__}}) { print "$word $b->{parser__}->{words__}{$word}\n"; } } $c->config_( 'piddir', $current_piddir ); # Reload configuration file ( to avoid updating configurations ) $c->load_configuration(); $b->release_session_key( $session ); $POPFile->CORE_stop(); } } else { print "bayes.pl - output the classification of a message\n\n"; print "Usage: bayes.pl \n"; print " Filename of message(s) to classify\n"; $code = 1; } exit $code; popfile-1.1.3+dfsg/insert.pl0000664000175000017500000000660111710356074015215 0ustar danieldaniel#!/usr/bin/perl # ---------------------------------------------------------------------------- # # insert.pl --- Inserts a mail message into a specific bucket # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use lib defined($ENV{POPFILE_ROOT})?$ENV{POPFILE_ROOT}:'./'; use POPFile::Loader; my $code = 0; if ( $#ARGV > 0 ) { # POPFile is actually loaded by the POPFile::Loader object which does all # the work my $POPFile = POPFile::Loader->new(); # Indicate that we should create not output on STDOUT (the POPFile # load sequence) $POPFile->debug(0); $POPFile->CORE_loader_init(); $POPFile->CORE_signals(); $POPFile->CORE_load( 1 ); $POPFile->CORE_link_components(); $POPFile->CORE_initialize(); my $bucket = shift @ARGV; my @files; if ($^O =~ /linux/) { @files = @ARGV[0 .. $#ARGV]; } else { @files = map { glob } @ARGV[0 .. $#ARGV]; } @ARGV = (); if ( $POPFile->CORE_config() ) { # Prevent the tool from finding another copy of POPFile running my $c = $POPFile->get_module( 'POPFile::Config' ); my $current_piddir = $c->config_( 'piddir' ); $c->config_( 'piddir', $c->config_( 'piddir' ) . 'insert.pl.' ); $POPFile->CORE_start(); my $b = $POPFile->get_module( 'Classifier::Bayes' ); my $session = $b->get_session_key( 'admin', '' ); # Check for the existence of each file first because the API # call we use does not care if a file is missing foreach my $file (@files) { if ( !(-e $file) ) { print STDERR "Error: File `$file' does not exist, insert aborted.\n"; $code = 1; last; } } if ( $code == 0 ) { if ( !$b->is_bucket( $session, $bucket ) ) { print STDERR "Error: Bucket `$bucket' does not exist, insert aborted.\n"; $code = 1; } else { $b->add_messages_to_bucket( $session, $bucket, @files ); print "Added ", $#files+1, " files to `$bucket'\n"; } } $c->config_( 'piddir', $current_piddir ); # Reload configuration file ( to avoid updating configurations ) $c->load_configuration(); $b->release_session_key( $session ); $POPFile->CORE_stop(); } } else { print "insert.pl - insert mail messages into a specific bucket\n\n"; print "Usage: insert.pl \n"; print " The name of the bucket\n"; print " Filename of message(s) to insert\n"; $code = 1; } exit $code; popfile-1.1.3+dfsg/pipe.pl0000664000175000017500000000560211710356074014646 0ustar danieldaniel#!/usr/bin/perl # ---------------------------------------------------------------------------- # # pipe.pl --- Read a message in on STDIN and write out the modified # version on STDOUT # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use lib defined($ENV{POPFILE_ROOT})?$ENV{POPFILE_ROOT}:'./'; use POPFile::Loader; # main if ( $#ARGV == -1 ) { # POPFile is actually loaded by the POPFile::Loader object which does all # the work my $POPFile = POPFile::Loader->new(); # Indicate that we should create not output on STDOUT (the POPFile # load sequence) $POPFile->debug(0); $POPFile->CORE_loader_init(); $POPFile->CORE_signals(); $POPFile->CORE_load( 1 ); $POPFile->CORE_link_components(); $POPFile->CORE_initialize(); # Ugly hack which is needed because Bayes::classify_and_modify looks up # the UI port and whether we are allowing remote connections or not # to set the XPL link in the header. If we don't have these predefined # then they'll be discarded when the configuration is loaded, and since # we are not loading the UI, they are not defined at this point my $c = $POPFile->get_module('POPFile::Config'); $c->module_config_( 'html', 'local', 1 ); $c->module_config_( 'html', 'port', 8080 ); if ( $POPFile->CORE_config() ) { # Prevent the tool from finding another copy of POPFile running my $current_piddir = $c->config_( 'piddir' ); $c->config_( 'piddir', $c->config_( 'piddir' ) . 'pipe.pl.' ); $POPFile->CORE_start(); my $b = $POPFile->get_module('Classifier::Bayes'); my $session = $b->get_session_key( 'admin', '' ); $b->classify_and_modify( $session, \*STDIN, \*STDOUT, 1, '', 0, 1, "\n" ); $c->config_( 'piddir', $current_piddir ); # Reload configuration file ( to avoid updating configurations ) $c->load_configuration(); $b->release_session_key( $session ); $POPFile->CORE_stop(); } exit 0; } else { print "pipe.pl - reads a message on STDIN, classifies it, outputs the modified version on STDOUT\n\n"; print "Usage: pipe.pl\n"; exit 1; } popfile-1.1.3+dfsg/popfile.pl0000664000175000017500000001013011710356074015337 0ustar danieldaniel#!/usr/bin/perl # ---------------------------------------------------------------------------- # # popfile.pl --- Message analyzer and sorter # # Acts as a server and client designed to sit between a real mail/news # client and a real mail/ news server using POP3. Inserts an extra # header X-Text-Classification: into the header to tell the client # which category the message belongs in and much more... # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # # ---------------------------------------------------------------------------- # Check the packing list of POPFile to ensure that all the required # modules are present. my $packing_list = defined($ENV{POPFILE_ROOT})?$ENV{POPFILE_ROOT}:'./'; $packing_list =~ s/[\\\/]$//; $packing_list .= '/popfile.pck'; my $fatal = 0; my @log; if ( open PACKING, "<$packing_list" ) { while () { if ( /^(REQUIRED|OPTIONAL-([^\t]+))\t([^\t]+)\t([^\r\n]+)/ ) { my ( $required, $why, $version, $module ) = ( $1, $2, $3, $4 ); # Find the module and set $ver to the loaded version, or -1 if # the module was not found local $::SIG{__DIE__}; local $::SIG{__WARN__}; eval "require $module"; my $ver = ${"${module}::VERSION"} || ${"${module}::VERSION"} || 0; $ver = ${"${module}::VERSION"} || ${"${module}::VERSION"} || 0; $ver = -1 if $@; if ( $ver == -1 ) { if ( $required eq 'REQUIRED' ) { $fatal = 1; print STDERR "ERROR: POPFile needs Perl module $module, please install it.\n"; } else { push @log, ("Warning: POPFile may require Perl module $module; it is needed only for \"$why\"."); } } } } close PACKING; } else { push @log, ("Warning: Couldn't open POPFile packing list ($packing_list) so cannot check configuration (this probably doesn't matter)"); } use strict; use locale; use lib defined( $ENV{POPFILE_ROOT} ) ? $ENV{POPFILE_ROOT} : '.'; use POPFile::Loader; # POPFile is actually loaded by the POPFile::Loader object which does all # the work my $POPFile = POPFile::Loader->new(); # Indicate that we should create output on STDOUT (the POPFile # load sequence) and initialize with the version $POPFile->debug(1); $POPFile->CORE_loader_init(); # Redefine POPFile's signals $POPFile->CORE_signals(); # Create the main objects that form the core of POPFile. Consists of # the configuration modules, the classifier, the UI (currently HTML # based), platform specific code, and the POP3 proxy. The link the # components together, intialize them all, load the configuration from # disk, start the modules running $POPFile->CORE_load(); $POPFile->CORE_link_components(); $POPFile->CORE_initialize(); if ( $POPFile->CORE_config() ) { $POPFile->CORE_start(); # If there were any log messages from the packing list check then # log them now if ( $#log != -1 ) { foreach my $m (@log) { $POPFile->get_module( 'POPFile::Logger' )->debug( 0, $m ); } } $POPFile->get_module( 'POPFile::Logger' )->debug( 0, "POPFile successfully started" ); # This is the main POPFile loop that services requests, it will # exit only when we need to exit $POPFile->CORE_service(); # Shutdown every POPFile module $POPFile->CORE_stop(); } # END popfile-1.1.3+dfsg/v1.1.3.change.nihongo0000664000175000017500000001673311630123402017004 0ustar danieldanielPOPFile v1.1.3 へようこそ POPFile はナイーブ・ベイズ法を利用したメール分類ツールであり、POP3、 SMTP、NNTP の各プロキシと IMAP フィルタ、ウェブインターフェースで構成 されています。POPFile はほとんどのプラットフォームで、ほとんどのメール クライアントとともに動作します。 このメンテナンスリリースでは、いくつかの細かい新機能の追加といくつかの バグ修正を行なっています。 POPFile のインストーラは、Windows XP 以降、Mac OS X 10.3.9 から 10.5.x、 10.6 (Snow Leopard)、10.7 (Lion) 用がそれぞれ提供されています。 Windows 版で使われている最小版の Perl のバージョンが更新されました。 このため、Windows 98、Windows ME、Windows NT と Windows 2000 は公式に はサポートされなくなりました。 v1.1.2 からの変更点 1. バグ修正 Windows 版のインストーラでデフォルト設定のままインストールした場合に、 SSL 接続に必要なモジュールがインストールされないバグを修正しました。 (ticket #166) (インストール時の言語で日本語 (Nihongo) を選択した場合は問題ありません でした) POPFile 終了時に、「Can't write to the configuration file」 (設定ファ イルに書き込みできません) という誤ったメッセージがログファイルに記録 されるバグを修正しました。(ticket #165) ネットワークが切断されたとき、IMAP モジュールがクラッシュすることがあ るバグを修正しました。 v1.1.1 からの変更点 1. 新機能 マグネットにおけるメールアドレスの扱いが改善されました。メールアドレス 全体が指定された場合 (例: test@example.com)、完全に一致するメールアド レスにのみ一致するようになりました (上の例では anothertest@example.com というアドレスには反応しません)。また、ドメインに一致するマグネット (example.com や @example.com、.example.com) もサポートされました。 (ticket #76) 完全一致、ドメイン一致に関する詳細は、以下を参照してください: http://getpopfile.org/docs/jp:glossary:amagnet 履歴タブで検索やバケツフィルタが使用されている際、履歴のメッセージすべ てが表示されていないかもしれないことをよりわかりやすくするため、検索、 フィルタの場所をハイライトするオプションが追加されました。このオプショ ンは、詳細設定タブの「html_search_filter_highlight」オプションを編集す ることで有効化できます。 (ticket #149) 2. Windows 版の改善 Windows 版のインストーラは、デフォルトで SSL サポートをインストールす るようになりました。SSL サポートはこれまでのバージョンのものよりも 小さく、単純で、かつ新しいパッケージとして提供されます。 (ticket #153) 3. Mac OS X 版の改善 Mac OS X 版のインストーラも、デフォルトで SSL サポートをインストール するようになりました。 (ticket #154) 4. その他の改善 このバージョンはメンテナンスリリースであり、大きな新機能はありません。 5. バグ修正 メール本文が Quoted-Printable でエンコードされており、本文の末尾が 表示上の行末 (soft line break : 「=」) である場合、メッセージの一部が 処理されないバグを修正しました。 (ticket #130) 数字の連続を誤って IP アドレスとして扱ってしまうことがあるバグを修正し ました。 (ticket #127) ユーティリティスクリプトを使用した際に、設定ファイル (popfile.cfg) の 設定の一部が削除されてしまうバグを修正しました。 (ticket #135) Perl の警告のいくつかについて修正しました。 ダウンロードできる場所 http://getpopfile.org/docs/JP:Download POPFile をはじめて使う POPFile をインストールして使用するための導入手順書として、クイック スタートガイドが用意されています: http://getpopfile.org/docs/JP:QuickStart Windows 環境における SSL サポート これまでは SSL サポートは Windows 版のオプション機能として提供されて いました。SSL サポートが選択された時には、SSL に必要なファイルはいつも インターネットからダウンロードされていました。 今回のリリースでは Windows 版はより新しく、より小さな SSL パッケージを 使用しています。結果的に、SSL サポートのファイルはインストーラに含まれ、 オプション機能ではなくなりました (つまり、常にインストールされることに なります)。 Mac OS X 版の三つのバージョン 三つのインストーラがリリースされています。Lion 向け、Snow Leopard 向け、 それよりも古いバージョン向けの三つです。Lion 向けのものにはファイル名 に「-lion-」が、Snow Leopard 向けのものにはファイル名に「-sl-」が含ま れています。 クロスプラットフォーム版を使用する場合 POPFile は CPAN にあるいくつかの Perl モジュールを必要とします。以下の モジュールが必要になるでしょう: Date::Parse HTML::Template HTML::Tagset DBD::SQLite (あるいは DBD::SQLite2) DBI TimeDate CPAN から Bundle::POPFile バンドルを取得することにより、POPFile が必要 とするすべてのモジュールをインストールすることができます。 詳しくは POPFile wiki のインストール手順を参照してください: http://getpopfile.org/docs/JP:HowTos:CrossPlatformInstall 日本語処理が必要な方は、使用したい日本語パーサによってプログラムや Perl モジュールを追加インストールする必要があるでしょう。これらの インストール方法についての情報は、POPFile wiki を参照してください: http://getpopfile.org/docs/JP:HowTos:CrossPlatformInstall 既知の問題 POPFile は現在のところ IPv4 のみをサポートしています。 (IPv6 はまだサポートしていません。) クロスプラットフォーム版に関する既知の問題 Windows 以外のプラットフォームで SSL を使用する場合、IO::Socket::SSL v0.97 もしくは v0.99 を使うべきではありません。これらは POPFile と 互換性がないことがわかっています。正しく動作する IO::Socket::SSL の 最新バージョンは v1.44 です。 Windows 版に関する既知の問題 1. Windows で複数のメールアカウントのメールを同時にチェックしたい Windows では Perl の新しいプロセスを起動するのには長い時間がかかる ため、デフォルトでは Windows 上で最適に動くよう調整されています。 メールプログラムが POPFile に接続すると、POPFile はそれを「親」 プロセス内で処理します。これにより、すぐに接続が行われ、メールのダウン ロードがすぐに始まります。しかしこれは一度にひとつのサーバからしか メッセージをダウンロードすることができないということを意味します(最大 で 6 つまでの接続が待ち行列に並べられ、届いた順番に処理されます)。 そして、メールをダウンロードしている間は UI を使用することはできませ ん。 この動作を無効にすることができます(そうすれば同時に UI を使用すること ができ、好きなだけメール接続を行うことができます)。UI の設定パネルで 「POP3 同時接続の許可:」が「はい」になっていることを確認してください。 あるいは、コマンドラインから --set pop3_force_fork=1 を指定します。 デフォルトの動作(POP3 同時接続不可)では、いくつかのアカウントを チェックした際にメールクライアントが時間切れになる可能性があります (POPFile は一度にひとつのアカウントしか処理しないため、すべての アカウントを処理するのにしばらく時間がかかるのです)。 SSL サポートを使用する場合には、デフォルトの設定(POP3 同時接続不可) を使用しなければいけません。そうでないと POPFile はエラーメッセージを 返します。 v1.0.0、v1.0.1、v1.1.0、v1.1.1 及び v1.1.2 のリリースノート v1.0.0 より以前のリリースからアップグレードする場合はより詳しい情報を 得るために v1.0.0、v1.0.1、v1.1.0、v1.1.1 及び v1.1.2 のリリースノート をお読みください。 http://getpopfile.org/docs/JP:ReleaseNotes:1.0.0 http://getpopfile.org/docs/JP:ReleaseNotes:1.0.1 http://getpopfile.org/docs/JP:ReleaseNotes:1.1.0 http://getpopfile.org/docs/JP:ReleaseNotes:1.1.1 http://getpopfile.org/docs/JP:ReleaseNotes:1.1.2 寄付 POPFile を支えるために、「Donate!」ボタンをクリックして苦労して稼いだ お金を私に寄付してくれたすべての方々に感謝しています。また、パッチの 提供や機能の要望、バグ報告、ユーザーサポート、翻訳などを行うために時間 を割いて協力してくれた方々にも感謝します。 http://getpopfile.org/docs/JP:Donate 十周年 今年は、POPFile の十周年の年にあたります。初めて公開されたのは 2002 年 ですが、実際に開発が始まったのは 2001 年でした。オリジナルのバージョン は Visual Basic で書かれ、AutoFile と呼ばれていました。 節目である今年の後半に、マルチユーザをサポートする待望の バージョン 2 をリリースしたいと考えています。 謝辞 POPFile に貢献してくださったすべての方々にとても感謝しています。 The POPFile Core Team (Brian, Joseph, Manni and Naoki) popfile-1.1.3+dfsg/v1.1.3.change0000664000175000017500000001623711630123402015343 0ustar danieldanielWelcome to POPFile v1.1.3 POPFile is an email classification tool with a Naive Bayes classifier, POP3, SMTP, NNTP proxies and IMAP filter and a web interface. It runs on most platforms and with most email clients. This maintenance release fixes some bugs. Installers are provided for Windows XP or later and Mac OS X 10.3.9 to 10.5.x, 10.6 (Snow Leopard) and 10.7 (Lion). The minimal Perl used by the Windows version has been upgraded and as a result Windows 9x, Windows Millennium, Windows NT and Windows 2000 are no longer officially supported. WHAT'S CHANGED SINCE v1.1.2 1. Bug fixes Fixed a bug that the installer for Windows does not install enough Perl modules for SSL support by default. (ticket #166) Fixed a bug that POPFile records a wrong message, "Can't write to the configuration file", when it shuts down. (ticket #165) Fixed a bug that IMAP module of POPFile sometimes crashes when the network connection is lost. WHAT'S CHANGED SINCE v1.1.1 1. New features Magnets now offer improved handling of addresses. If a complete email address (e.g. test@example.com) is specified then the magnet will now match only that exact address (e.g. anothertest@example.com will not be caught by the magnet). Domain magnets (e.g. example.com, @example.com and .example.com) are now supported properly. (ticket #76) For more information about exact match and domain match, see: http://getpopfile.org/docs/glossary:amagnet The search/bucket filter part of the History tab can be highlighted when the page is showing the results of a search or a filter to make it more obvious that the page may not be showing all of the message history. You can enable this new feature by setting the 'html_search_filter_highlight' option in the Advanced tab to 1. (ticket #149) 2. Windows version improvements The installer for Windows now installs SSL support by default. SSL Support is now provided by a smaller and simpler package which is more up-to-date than the package used in earlier releases. (ticket #153) Several of the utilities included with the Windows version have been upgraded, including the diagnostic utility. 3. Mac OS X version improvements The installers for Mac OS X also install SSL support by default. (ticket #154) 4. Other improvements This is a maintenance release so there are no major new features included. 5. Bug fixes Fixed a bug that POPFile ignored part of message body if the message is encoded in Quoted-Printable and a soft line break (=) exists at the end of its body. (ticket #130) Fixed a bug that POPFile wrongly treated some continuation of numbers as IP addresses. (ticket #127) Fixed a bug in some utility scripts that resulted in the removal of some entries from the configuration file (popfile.cfg). (ticket #135) Avoid some Perl warnings. WHERE TO DOWNLOAD http://getpopfile.org/download/ GETTING STARTED WITH POPFILE An introduction to installing and using POPFile can be found in the QuickStart guide: http://getpopfile.org/docs/QuickStart SSL SUPPORT IN WINDOWS Up until now SSL support has been an optional feature in the Windows version and when SSL support was selected the necessary SSL support files were always downloaded from the internet. For this release the Windows version uses a more up-to-date and smaller SSL package. As a result the SSL support files are now included in the installer and are no longer optional (i.e. they are always installed now). THREE VERSIONS RELEASED FOR MAC OS X There are three versions of the installer for Mac OS X systems: one for the 'Lion' release, one for the previous 'Snow Leopard' release and one for the the earlier 10.3.9 to 10.5.x releases. The 'Lion' installer has '-lion-' in its filename and the 'Snow Leopard' installer has '-sl-' in its filename. I AM USING THE CROSS PLATFORM VERSION POPFile requires a number of Perl modules that are available from CPAN. You will need: Date::Parse HTML::Template HTML::Tagset DBD::SQLite (or DBD::SQLite2) DBI TimeDate You can install all the required POPFile modules by getting the Bundle::POPFile bundle from CPAN. Please refer to the installation instructions on the POPFile wiki: http://getpopfile.org/docs/HowTos:CrossPlatformInstall Japanese users may need to install some extra programs and Perl modules, depending upon which Nihongo parser (wakachi-gaki program) they wish to use. For more information about how to install them, see the POPFile wiki: http://getpopfile.org/docs/JP:HowTos:CrossPlatformInstall KNOWN ISSUES POPFile currently supports IPv4 only. (IPv6 is not supported yet.) CROSS PLATFORM VERSION KNOWN ISSUES Users of SSL on non-Windows platforms should NOT use IO::Socket::SSL v0.97 or v0.99. They are known to be incompatible with POPFile; v1.44 is the most recent release of IO::Socket::SSL that works correctly. WINDOWS KNOWN ISSUES 1. ON WINDOWS I WANT TO CHECK MULTIPLE EMAIL ACCOUNTS SIMULTANEOUSLY. Because the time taken to start a new process on Windows is long under Perl there is an optimization for Windows that is present by default: when a new connection is made between your email program and POPFile, POPFile handles it in the 'parent' process. This means the connect happens fast and mail starts downloading very quickly, but it means that you can only download messages from one server at a time (up to 6 other connections will be queued up and dealt with in the order they arrive) and the UI is unavailable while downloading email. You can turn this behavior off (and get simultaneous UI/email access and as many email connections as you like) on the Configuration panel in the UI by making sure that "Allow concurrent POP3 connections:" is Yes, or by specifying --set pop3_force_fork=1 on the command line. The default behaviour (no concurrent POP3 connections) can cause email clients to time out if several accounts are being checked (because POPFile only handles one account at a time it can take a while to process all of the accounts). If SSL support is being used then the default setting (no concurrent POP3 connections) _MUST_ be used otherwise POPFile returns an error message. v1.0.0, v1.0.1, v1.1.0, v1.1.1 and v1.1.2 RELEASE NOTES If you are upgrading from pre-v1.0.0 please read the v1.0.0, v1.0.1, v1.1.0, v1.1.1 and v1.1.2 release notes for much more information: http://getpopfile.org/docs/ReleaseNotes:1.0.0 http://getpopfile.org/docs/ReleaseNotes:1.0.1 http://getpopfile.org/docs/ReleaseNotes:1.1.0 http://getpopfile.org/docs/ReleaseNotes:1.1.1 http://getpopfile.org/docs/ReleaseNotes:1.1.2 DONATIONS Thank you to everyone who has clicked the Donate! button and donated their hard earned cash to me in support of POPFile. Thank you also to the people who have contributed their time through patches, feature requests, bug reports, user support and translations. http://getpopfile.org/docs/donate 10TH ANNIVERSARY This year is the tenth anniversary of POPFile. Although it was first released to the public in 2002 development actually started in 2001. The original version was written in Visual Basic and called AutoFile. We hope to release the long-awaited POPFile version 2 with multi-user support later this year. THANKS Big thanks to all who've contributed to POPFile. The POPFile Core Team (Brian, Joseph, Manni and Naoki) popfile-1.1.3+dfsg/UI/0000775000175000017500000000000011710356074013666 5ustar danieldanielpopfile-1.1.3+dfsg/UI/HTML.pm0000664000175000017500000037105111710356074014777 0ustar danieldaniel# POPFILE LOADABLE MODULE package UI::HTML; #---------------------------------------------------------------------------- # # This package contains an HTML UI for POPFile # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use UI::HTTP; @ISA = ("UI::HTTP"); use strict; use warnings; use locale; use IO::Socket; use IO::Select; use Digest::MD5 qw( md5_hex ); use HTML::Template; use Date::Format; # A handy variable containing the value of an EOL for the network my $eol = "\015\012"; # Constant used by the history deletion code my $seconds_per_day = 60 * 60 * 24; # These are used for Japanese support # ASCII characters my $ascii = '[\x00-\x7F]'; # EUC-JP 2 byte characters my $two_bytes_euc_jp = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # EUC-JP 3 byte characters my $three_bytes_euc_jp = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # EUC-JP characters my $euc_jp = "(?:$ascii|$two_bytes_euc_jp|$three_bytes_euc_jp)"; my %headers_table = ( 'from', 'From', # PROFILE BLOCK START 'to', 'To', 'cc', 'Cc', 'subject', 'Subject', 'date', 'Date', 'inserted', 'Arrived', 'size', 'Size', 'bucket', 'Classification'); # PROFILE BLOCK STOP #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = UI::HTTP->new(); # The classifier (Classifier::Bayes) $self->{c__} = 0; # Session key to make the UI safer $self->{session_key__} = ''; # The available skins $self->{skins__} = (); # A hash containing a mapping between alphanumeric identifiers and # appropriate strings used for localization. The string may # contain sprintf patterns for use in creating grammatically # correct strings, or simply be a string $self->{language__} = {}; # This is the list of available languages $self->{languages__} = (); # The last user to login via a proxy $self->{last_login__} = ''; # Used to determine whether the cache needs to be saved $self->{save_cache__} = 0; # Stores a Classifier::Bayes session and is set up on the first UI # connection $self->{api_session__} = ''; # Must call bless before attempting to call any methods bless $self, $type; # This is the HTML module which we know as the HTML module $self->name( 'html' ); return $self; } #---------------------------------------------------------------------------- # # initialize # # Called to initialize the interface # #---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # The default listen port for the UI $self->config_( 'port', 8080 ); # Sending of statistics is off $self->config_( 'send_stats', 0 ); # The size of a history page $self->config_( 'page_size', 20 ); # Only accept connections from the local machine for the UI $self->config_( 'local', 1 ); # If no UI skin is specified use 'simplyblue' as the default $self->config_( 'skin', 'simplyblue' ); # The user interface password $self->config_( 'password', md5_hex( '__popfile__' ) ); # The last time (textual) that the statistics were reset my $lt = localtime; $self->config_( 'last_reset', $lt ); # We start by assuming that the user speaks English like the # perfidious Anglo-Saxons that we are... :-) $self->config_( 'language', 'English' ); # If this is 1 then when the language is loaded we will use the # language string identifier as the string shown in the UI. This # is used to test whether which identifiers are used where. $self->config_( 'test_language', 0 ); # This setting defines what is displayed in the word matrix: # 'freq' for frequencies, 'prob' for probabilities, 'score' for # logarithmic scores, if blank then the word table is not shown $self->config_( 'wordtable_format', '' ); # Controls whether to cache templates or not $self->config_( 'cache_templates', 0 ); # Controls whether or not we die if a template variable is missing # when we try to set it. Setting it to 1 can be useful for # debugging purposes $self->config_( 'strict_templates', 0 ); # The default columns to show in the History page. The order here # is important, as is the presence of a + (show this column) or - # (hide this column) in the value. By default we show everything $self->config_( 'columns', # PROFILE BLOCK START '+inserted,+from,+to,-cc,+subject,-date,-size,+bucket' ); # PROFILE BLOCK STOP # An overriden date format set by the user, if empty then the # Locale_Date from the language file is used (see pretty_date__) $self->config_( 'date_format', '' ); # If you want session dividers $self->config_( 'session_dividers', 1 ); # The number of characters to show in each column in the history, if set # to 0 then POPFile tries to do this automatically $self->config_( 'column_characters', 0 ); # Two variables that tell us whether to show help items # concerning bucket setup and training. The bucket item # is displayed by default, when it is turned off, the # training item is shown. $self->config_( 'show_training_help', 0 ); $self->config_( 'show_bucket_help', 1 ); # If you want to highlight active search or filter settings $self->config_( 'search_filter_highlight', 0 ); # Load skins $self->load_skins__(); # Load the list of available user interface languages $self->load_languages__(); # Calculate a session key $self->change_session_key__(); # The parent needs a reference to the url handler function $self->{url_handler_} = \&url_handler__; # Finally register for the messages that we need to receive $self->mq_register_( 'UIREG', $self ); $self->mq_register_( 'LOGIN', $self ); $self->calculate_today(); return 1; } #---------------------------------------------------------------------------- # # start # # Called to start the HTML interface running # #---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # In pre v0.21.0 POPFile the UI password was stored in plaintext # in the configuration data. Check to see if the password is not # a hash and upgrade it automatically here. if ( length( $self->config_( 'password' ) ) != 32 ) { $self->config_( 'password', md5_hex( '__popfile__' . $self->config_( 'password' ) ) ); } # Get a query session with the History object $self->{q__} = $self->{history__}->start_query(); # Ensure that the messages subdirectory exists if ( !$self->{history__}->make_directory__( # PROFILE BLOCK START $self->get_user_path_( $self->global_config_( 'msgdir' ) ) ) ) { # PROFILE BLOCK STOP print STDERR "Failed to create the messages subdirectory\n"; return 0; } # Load the current configuration from disk and then load up the # appropriate language, note that we always load English first so # that any extensions to the user interface that have not yet been # translated will still appear $self->load_language( 'English' ); if ( $self->config_( 'language' ) ne 'English' ) { $self->load_language( $self->config_( 'language' ) ); } # Set the classifier option wmformat__ according to our wordtable_format # option. $self->{c__}->wmformat( $self->config_( 'wordtable_format' ) ); return $self->SUPER::start(); } #---------------------------------------------------------------------------- # # stop # # Called to stop the HTML interface running # #---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; if ( $self->{api_session__} ne '' ) { $self->{c__}->release_session_key( $self->{api_session__} ); } $self->{history__}->stop_query( $self->{q__} ); $self->SUPER::stop(); } #---------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # There is no return value from this method # #---------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; # Handle registration of UI components if ( $type eq 'UIREG' ) { $self->register_configuration_item__( @message ); } if ( $type eq 'LOGIN' ) { $self->{last_login__} = $message[0]; } } #---------------------------------------------------------------------------- # # url_handler__ - Handle a URL request # # $client The web browser to send the results to # $url URL to process # $command The HTTP command used (GET or POST) # $content Any non-header data in the HTTP command # # Checks the session key and refuses access unless it matches. Serves # up a small set of specific urls that are the main UI pages and then # any GIF file in the POPFile directory and CSS files in the skins # subdirectory # #---------------------------------------------------------------------------- sub url_handler__ { my ( $self, $client, $url, $command, $content ) = @_; # Check to see if we obtained the session key yet if ( $self->{api_session__} eq '' ) { $self->{api_session__} = $self->{c__}->get_session_key( # PROFILE BLOCK START 'admin', '' ); # PROFILE BLOCK STOP } # See if there are any form parameters and if there are parse them # into the %form hash delete $self->{form_}; # Remove a # element $url =~ s/#.*//; # If the URL was passed in through a GET then it may contain form # arguments separated by & signs, which we parse out into the # $self->{form_} where the key is the argument name and the value # the argument value, for example if you have foo=bar in the URL # then $self->{form_}{foo} is bar. if ( $command =~ /GET/i ) { if ( $url =~ s/\?(.*)// ) { $self->parse_form_( $1 ); } } # If the URL was passed in through a POST then look for the POST data # and parse it filling the $self->{form_} in the same way as for GET # arguments if ( $command =~ /POST/i ) { $content =~ s/[\r\n]//g; $self->parse_form_( $content ); } if ( $url =~ /\/autogen_(.+)\.bmp/ ) { $self->bmp_file__( $client, $1 ); return 1; } if ( $url =~ /\/(.+\.gif)/ ) { $self->http_file_( $client, $self->get_root_path_( $1 ), 'image/gif' ); return 1; } if ( $url =~ /\/(.+\.png)/ ) { $self->http_file_( $client, $self->get_root_path_( $1 ), 'image/png' ); return 1; } if ( $url =~ /\/(.+\.ico)/ ) { $self->http_file_( $client, $self->get_root_path_( $1 ), # PROFILE BLOCK START 'image/x-icon' ); # PROFILE BLOCK STOP return 1; } if ( $url =~ /(skins\/.+\.css)/ ) { $self->http_file_( $client, $self->get_root_path_( $1 ), 'text/css' ); return 1; } if ( $url =~ /(manual\/.+\.html)/ ) { $self->http_file_( $client, $self->get_root_path_( $1 ), 'text/html' ); return 1; } # Check the password if ( $url eq '/password' ) { if ( defined( $self->{form_}{password} ) && # PROFILE BLOCK START ( md5_hex( '__popfile__' . $self->{form_}{password} ) eq $self->config_( 'password' ) ) ) { # PROFILE BLOCK STOP $self->change_session_key__( $self ); delete $self->{form_}{password}; $self->{form_}{session} = $self->{session_key__}; if ( defined( $self->{form_}{redirect} ) ) { $url = $self->{form_}{redirect}; if ( $url =~ s/\?(.*)// ) { $self->parse_form_( $1 ); } } } else { $self->password_page( $client, defined( $self->{form_}{password} ), '/' ); return 1; } } # If there's a password defined then check to see if the user # already knows the session key, if they don't then drop to the # password screen if ( ( (!defined($self->{form_}{session})) || # PROFILE BLOCK START ($self->{form_}{session} eq '' ) || ( $self->{form_}{session} ne $self->{session_key__} ) ) && ( $self->config_( 'password' ) ne md5_hex( '__popfile__' ) ) ) { # PROFILE BLOCK STOP # Since the URL that has caused us to hit the password page # might have information stored in the form hash we need to # extract it out (except for the session key) and package it # up so that the password page can redirect to the right place # if the correct password is entered. This is especially # important for the XPL functionality. my $redirect_url = $url . '?'; foreach my $k (keys %{$self->{form_}}) { # Skip the session key since we are in the process of # assigning a new one through the password page if ( $k ne 'session' ) { # If we are dealing with an array of values (see # parse_form_ for details) then we need to unpack it # into separate entries) if ( $k =~ /^(.+)_array$/ ) { my $field = $1; foreach my $v (@{$self->{form_}{$k}}) { $redirect_url .= "$field=$v&" } } else { $redirect_url .= "$k=$self->{form_}{$k}&" } } } $redirect_url =~ s/&$//; $self->password_page( $client, 0, $redirect_url ); return 1; } if ( $url eq '/jump_to_message' ) { $self->{form_}{filter} = ''; $self->{form_}{negate} = ''; $self->{form_}{search} = ''; $self->{form_}{setsearch} = 1; my $slot = $self->{form_}{view}; if ( ( $slot =~ /^\d+$/ ) && # PROFILE BLOCK START ( $self->{history__}->is_valid_slot( $slot ) ) ) { # PROFILE BLOCK STOP $self->http_redirect_( $client, # PROFILE BLOCK START "/view?session=$self->{session_key__}&view=$slot" ); # PROFILE BLOCK STOP } else { $self->http_redirect_( $client, "/history" ); } return 1; } if ( $url =~ /(popfile.*\.log)/ ) { $self->http_file_( $client, $self->logger()->debug_filename(), # PROFILE BLOCK START 'text/plain' ); # PROFILE BLOCK STOP return 1; } if ( ( defined($self->{form_}{session}) ) && # PROFILE BLOCK START ( $self->{form_}{session} ne $self->{session_key__} ) ) { # PROFILE BLOCK STOP $self->session_page( $client, 0, $url ); return 1; } if ( ( $url eq '/' ) || (!defined($self->{form_}{session})) ) { delete $self->{form_}; } if ( $url eq '/shutdown' ) { my $text = $self->shutdown_page__(); my $charset = $self->{language__}{LanguageCharset}; my $http_header = $self->build_http_header_( 200, "text/html; charset=$charset", 0, length( $text ) ); if ( $client->connected ) { print $client $http_header . $text; } return 0; } # Watch out for clicks on the "Don't show me this again." buttons. # If that button is clicked for the bucket-setup item, we turn on # the training help item. And if this one is clicked away, both # will no longer be shown. if ( exists $self->{form_}{nomore_bucket_help} && # PROFILE BLOCK START $self->{form_}{nomore_bucket_help} ) { # PROFILE BLOCK STOP $self->config_( 'show_bucket_help', 0 ); $self->config_( 'show_training_help', 1 ); } if ( exists $self->{form_}{nomore_training_help} && # PROFILE BLOCK START $self->{form_}{nomore_training_help} ) { # PROFILE BLOCK STOP $self->config_( 'show_training_help', 0 ); } # The url table maps URLs that we might receive to pages that we # display, the page table maps the pages to the functions that # handle them and the related template my %page_table = ( # PROFILE BLOCK START 'security' => [ \&security_page, 'security-page.thtml' ], 'configuration' => [ \&configuration_page, 'configuration-page.thtml' ], 'buckets' => [ \&corpus_page, 'corpus-page.thtml' ], 'magnets' => [ \&magnet_page, 'magnet-page.thtml' ], 'advanced' => [ \&advanced_page, 'advanced-page.thtml' ], 'history' => [ \&history_page, 'history-page.thtml' ], 'view' => [ \&view_page, 'view-page.thtml' ] ); # PROFILE BLOCK STOP my %url_table = ( '/security' => 'security', # PROFILE BLOCK START '/configuration' => 'configuration', '/buckets' => 'buckets', '/magnets' => 'magnets', '/advanced' => 'advanced', '/view' => 'view', '/history' => 'history', '/' => 'history' ); # PROFILE BLOCK STOP # Any of the standard pages can be found in the url_table, the # other pages are probably files on disk if ( defined($url_table{$url}) ) { my ( $method, $template ) = @{$page_table{$url_table{$url}}}; if ( !defined( $self->{api_session__} ) ) { $self->http_error_( $client, 500 ); return; } &{$method}( $self, $client, $self->load_template__( $template ) ); return 1; } $self->http_error_( $client, 404 ); return 1; } #--------------------------------------------------------------------------- # # bmp_file__ - Sends a 1x1 bitmap of a specific color to the browser # # $client The web browser to send result to # $color An HTML color (hex or named) # #---------------------------------------------------------------------------- sub bmp_file__ { my ( $self, $client, $color ) = @_; $color = lc($color); # TODO: this is dirty something higher up (HTTP) should be # decoding the URL $color =~ s/^%23//; # if we have an prefixed hex color value, # just dump the encoded hash-mark (#) # If the color contains something other than hex then do a map # on it first and then get the hex color, from the hex color # create a BMP file and return it if ( $color !~ /^[0-9a-f]{6}$/ ) { $color = $self->{c__}->{parser__}->map_color( $color ); } if ( $color =~ /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/ ) { my $bmp = '424d3a0000000000000036000000280000000100000001000000010018000000000004000000eb0a0000eb0a00000000000000000000' . "$3$2$1" . '00'; my $file = ''; for my $i (0..length($bmp)/2-1) { $file .= chr(hex(substr($bmp,$i*2,2))); } my $http_header = $self->build_http_header_( 200, "image/bmp", 0, length( $file ) ); if ( $client->connected ) { print $client $http_header . $file; } return 0; } else { return $self->http_error_( $client, 404 ); } } #--------------------------------------------------------------------------- # # http_ok - Output a standard HTTP 200 message with a body of data # from a template # # $client The web browser to send result to # $templ The template for the page to return # $selected Which tab is to be selected # #---------------------------------------------------------------------------- sub http_ok { my ( $self, $client, $templ, $selected ) = @_; $selected = -1 if ( !defined( $selected ) ); my @tab = ( 'menuStandard', 'menuStandard', 'menuStandard', 'menuStandard', 'menuStandard', 'menuStandard' ); $tab[$selected] = 'menuSelected' if ( ( $selected <= $#tab ) && # PROFILE BLOCK START ( $selected >= 0 ) ); # PROFILE BLOCK STOP for my $i (0..$#tab) { $templ->param( "Common_Middle_Tab$i" => $tab[$i] ); } my $update_check = ''; # Check to see if we've checked for updates today. If we have not # then insert a reference to an image that is generated through a # CGI. Also send stats to the same site if that is allowed. if ( $self->{today__} ne $self->global_config_( 'last_update_check' ) ) { $self->calculate_today(); if ( $self->global_config_( 'update_check' ) ) { my ( $major_version, $minor_version, $build_version ) = # PROFILE BLOCK START $self->version() =~ /^v([^.]*)\.([^.]*)\.(.*)$/; # PROFILE BLOCK STOP $templ->param( 'Common_Middle_If_UpdateCheck' => 1 ); $templ->param( 'Common_Middle_Major_Version' => $major_version ); $templ->param( 'Common_Middle_Minor_Version' => $minor_version ); $templ->param( 'Common_Middle_Build_Version' => $build_version ); } if ( $self->config_( 'send_stats' ) ) { $templ->param( 'Common_Middle_If_SendStats' => 1 ); my @buckets = $self->{c__}->get_buckets( # PROFILE BLOCK START $self->{api_session__} ); # PROFILE BLOCK STOP my $bc = $#buckets + 1; $templ->param( 'Common_Middle_Buckets' => $bc ); $templ->param( 'Common_Middle_Messages' => $self->mcount__() ); $templ->param( 'Common_Middle_Errors' => $self->ecount__() ); } $self->global_config_( 'last_update_check', $self->{today__}, 1 ); } # Build an HTTP header for standard HTML my $charset = $self->{language__}{LanguageCharset}; my $text = $templ->output; my $http_header = $self->build_http_header_( 200, "text/html; charset=$charset", 0, length( $text ) ); if ( $client->connected ) { $client->print( $http_header . $text ); } } #---------------------------------------------------------------------------- # # configuration_page - get the configuration options # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub configuration_page { my ( $self, $client, $templ ) = @_; if ( defined($self->{form_}{skin}) ) { $self->config_( 'skin', $self->{form_}{skin} ); $templ = $self->load_template__( 'configuration-page.thtml' ); } if ( ( defined($self->{form_}{debug}) ) && # PROFILE BLOCK START ( ( $self->{form_}{debug} >= 1 ) && ( $self->{form_}{debug} <= 4 ) ) ) { # PROFILE BLOCK STOP $self->global_config_( 'debug', $self->{form_}{debug}-1 ); } if ( defined($self->{form_}{language}) ) { if ( $self->config_( 'language' ) ne $self->{form_}{language} ) { $self->config_( 'language', $self->{form_}{language} ); if ( $self->config_( 'language' ) ne 'English' ) { $self->load_language( 'English' ); } $self->load_language( $self->config_( 'language' ) ); # Force a template relocalization because the language has been # changed which changes the localization of the template $self->localize_template__( $templ ); } } # Load all of the templates that are needed for the dynamic parts of # the configuration page, and for each one call its validation interface # so that any error messages or informational messages are fixed up # first my %dynamic_templates; for my $name (keys %{$self->{dynamic_ui__}{configuration}}) { $dynamic_templates{$name} = $self->load_template__( # PROFILE BLOCK START $self->{dynamic_ui__}{configuration}{$name}{template} ); # PROFILE BLOCK STOP $self->{dynamic_ui__}{configuration}{$name}{object}->validate_item( # PROFILE BLOCK START $name, $dynamic_templates{$name}, \%{$self->{language__}}, \%{$self->{form_}} ); # PROFILE BLOCK STOP } if ( defined($self->{form_}{ui_port}) ) { if ( ( $self->{form_}{ui_port} >= 1 ) && # PROFILE BLOCK START ( $self->{form_}{ui_port} < 65536 ) && ( $self->module_config_( 'pop3', 'port' ) ne $self->{form_}{ui_port} ) ) { # PROFILE BLOCK STOP $self->config_( 'port', $self->{form_}{ui_port} ); } else { if ( ( $self->module_config_( 'pop3', 'port' ) ne $self->{form_}{ui_port} ) ) { $templ->param( 'Configuration_If_UI_Port_Error' => 1 ); } else { $templ->param( 'Configuration_If_UI_POP3_Port_Error' => 1 ); } delete $self->{form_}{ui_port}; } } if ( defined($self->{form_}{ui_port} ) ) { $templ->param( 'Configuration_UI_Port_Updated' => # PROFILE BLOCK START sprintf( $self->{language__}{Configuration_UIUpdate}, $self->config_( 'port' ) ) ); # PROFILE BLOCK STOP } $templ->param( 'Configuration_UI_Port' => $self->config_( 'port' ) ); if ( defined($self->{form_}{page_size}) ) { if ( ( $self->{form_}{page_size} >= 1 ) && # PROFILE BLOCK START ( $self->{form_}{page_size} <= 1000 ) ) { # PROFILE BLOCK STOP $self->config_( 'page_size', $self->{form_}{page_size} ); } else { $templ->param( 'Configuration_If_Page_Size_Error' => 1 ); delete $self->{form_}{page_size}; } } if ( defined($self->{form_}{page_size} ) ) { $templ->param( 'Configuration_Page_Size_Updated' => # PROFILE BLOCK START sprintf( $self->{language__}{Configuration_HistoryUpdate}, $self->config_( 'page_size' ) ) ) # PROFILE BLOCK STOP } $templ->param( 'Configuration_Page_Size' => $self->config_( 'page_size' ) ); if ( defined($self->{form_}{history_days}) ) { if ( ( $self->{form_}{history_days} >= 1 ) && # PROFILE BLOCK START ( $self->{form_}{history_days} <= 366 ) ) { # PROFILE BLOCK STOP $self->module_config_( 'history', 'history_days', # PROFILE BLOCK START $self->{form_}{history_days} ); # PROFILE BLOCK STOP } else { $templ->param( 'Configuration_If_History_Days_Error' => 1 ); delete $self->{form_}{history_days}; } if ( defined( $self->{form_}{purge_history} ) ) { $self->{history__}->cleanup_history(); } } $templ->param( 'Configuration_History_Days_Updated' => sprintf( $self->{language__}{Configuration_DaysUpdate}, $self->module_config_( 'history', 'history_days' ) ) ) if ( defined($self->{form_}{history_days} ) ); $templ->param( 'Configuration_History_Days' => $self->module_config_( 'history', 'history_days' ) ); if ( defined($self->{form_}{timeout}) ) { if ( ( $self->{form_}{timeout} >= 10 ) && ( $self->{form_}{timeout} <= 1800 ) ) { $self->global_config_( 'timeout', $self->{form_}{timeout} ); } else { $templ->param( 'Configuration_If_TCP_Timeout_Error' => 1 ); delete $self->{form_}{timeout}; } } $templ->param( 'Configuration_TCP_Timeout_Updated' => sprintf( $self->{language__}{Configuration_TCPTimeoutUpdate}, $self->global_config_( 'timeout' ) ) ) if ( defined($self->{form_}{timeout} ) ); $templ->param( 'Configuration_TCP_Timeout' => $self->global_config_( 'timeout' ) ); if ( defined( $self->{form_}{update_fields} ) ) { my @columns = split(',', $self->config_( 'columns' )); my $new_columns = ''; foreach my $column (@columns) { $column =~ s/^(\+|\-)//; if ( defined($self->{form_}{$column})) { $new_columns .= '+'; } else { $new_columns .= '-'; } $new_columns .= $column; $new_columns .= ','; } $self->config_( 'columns', $new_columns ); } my ( @general_skins, @small_skins, @tiny_skins ); for my $i (0..$#{$self->{skins__}}) { my %row_data; my $type = 'General'; my $list = \@general_skins; my $name = $self->{skins__}[$i]; $name =~ /\/([^\/]+)\/$/; $name = $1; my $selected = ( $name eq $self->config_( 'skin' ) )?'selected':''; if ( $name =~ /tiny/ ) { $type = 'Tiny'; $list = \@tiny_skins; } else { if ( $name =~ /small/ ) { $type = 'Small'; $list = \@small_skins; } } $row_data{"Configuration_$type" . '_Skin'} = $name; $row_data{"Configuration_$type" . '_Selected'} = $selected; push ( @$list, \%row_data ); } $templ->param( "Configuration_Loop_General_Skins", \@general_skins ); $templ->param( "Configuration_Loop_Small_Skins", \@small_skins ); $templ->param( "Configuration_Loop_Tiny_Skins", \@tiny_skins ); my @language_loop; foreach my $lang (@{$self->{languages__}}) { my %row_data; $row_data{Configuration_Language} = $lang; $row_data{Configuration_Selected_Language} = ( $lang eq $self->config_( 'language' ) )?'selected':''; push ( @language_loop, \%row_data ); } $templ->param( 'Configuration_Loop_Languages' => \@language_loop ); my @columns = split(',', $self->config_( 'columns' )); my @column_data; foreach my $column (@columns) { my %row; $column =~ /(\+|\-)/; my $selected = ($1 eq '+')?'checked':''; $column =~ s/^.//; $row{Configuration_Field_Name} = $column; $row{Configuration_Localized_Field_Name} = # PROFILE BLOCK START $self->{language__}{$headers_table{$column}}; # PROFILE BLOCK STOP $row{Configuration_Field_Value} = $selected; push ( @column_data, \%row ); } $templ->param( 'Configuration_Loop_History_Columns' => \@column_data ); # Insert all the items that are dynamically created from the # modules that are loaded my $configuration_html = ''; my $last_module = ''; for my $name (sort keys %{$self->{dynamic_ui__}{configuration}}) { $name =~ /^([^_]+)_/; my $module = $1; if ( $last_module ne $module ) { $last_module = $module; $configuration_html .= "
\n

"; $configuration_html .= uc($module); $configuration_html .= "

\n"; } $self->{dynamic_ui__}{configuration}{$name}{object}->configure_item( $name, $dynamic_templates{$name}, \%{$self->{language__}} ); $configuration_html .= $dynamic_templates{$name}->output; } $templ->param( 'Configuration_Dynamic' => $configuration_html ); $templ->param( 'Configuration_Debug_' . ( $self->global_config_( 'debug' ) + 1 ) . '_Selected' => 'selected' ); if ( $self->global_config_( 'debug' ) & 1 ) { $templ->param( 'Configuration_If_Show_Log' => 1 ); } $self->http_ok( $client, $templ, 3 ); } #---------------------------------------------------------------------------- # # security_page - get the security configuration page # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub security_page { my ( $self, $client, $templ ) = @_; my $server_error = ''; my $port_error = ''; if ( ( defined($self->{form_}{password}) ) && # PROFILE BLOCK START ( $self->{form_}{password} ne $self->config_( 'password' ) ) ) { # PROFILE BLOCK STOP $self->config_( 'password', md5_hex( '__popfile__' . $self->{form_}{password} ) ) } $self->config_( 'local', $self->{form_}{localui}-1 ) if ( defined($self->{form_}{localui}) ); $self->global_config_( 'update_check', $self->{form_}{update_check}-1 ) if ( defined($self->{form_}{update_check}) ); $self->config_( 'send_stats', $self->{form_}{send_stats}-1 ) if ( defined($self->{form_}{send_stats}) ); $templ->param( 'Security_If_Local' => ( $self->config_( 'local' ) == 1 ) ); $templ->param( 'Security_Password' => ( $self->config_( 'password' ) eq md5_hex( '__popfile__' ) )?'':$self->config_( 'password' ) ); $templ->param( 'Security_If_Password_Updated' => ( defined($self->{form_}{password} ) ) ); $templ->param( 'Security_If_Update_Check' => ( $self->global_config_( 'update_check' ) == 1 ) ); $templ->param( 'Security_If_Send_Stats' => ( $self->config_( 'send_stats' ) == 1 ) ); my %security_templates; for my $name (keys %{$self->{dynamic_ui__}{security}}) { $security_templates{$name} = $self->load_template__( # PROFILE BLOCK START $self->{dynamic_ui__}{security}{$name}{template} ); # PROFILE BLOCK STOP $self->{dynamic_ui__}{security}{$name}{object}->validate_item( # PROFILE BLOCK START $name, $security_templates{$name}, \%{$self->{language__}}, \%{$self->{form_}} ); # PROFILE BLOCK STOP } my %chain_templates; for my $name (keys %{$self->{dynamic_ui__}{chain}}) { $chain_templates{$name} = $self->load_template__( # PROFILE BLOCK START $self->{dynamic_ui__}{chain}{$name}{template} ); # PROFILE BLOCK STOP $self->{dynamic_ui__}{chain}{$name}{object}->validate_item( # PROFILE BLOCK START $name, $chain_templates{$name}, \%{$self->{language__}}, \%{$self->{form_}} ); # PROFILE BLOCK STOP } my $security_html = ''; for my $name (sort keys %{$self->{dynamic_ui__}{security}}) { $self->{dynamic_ui__}{security}{$name}{object}->configure_item( # PROFILE BLOCK START $name, $security_templates{$name}, \%{$self->{language__}} ); # PROFILE BLOCK STOP $security_html .= $security_templates{$name}->output; } my $chain_html = ''; for my $name (sort keys %{$self->{dynamic_ui__}{chain}}) { $self->{dynamic_ui__}{chain}{$name}{object}->configure_item( # PROFILE BLOCK START $name, $chain_templates{$name}, \%{$self->{language__}} ); # PROFILE BLOCK STOP $chain_html .= $chain_templates{$name}->output; } $templ->param( 'Security_Dynamic_Security' => $security_html ); $templ->param( 'Security_Dynamic_Chain' => $chain_html ); $self->http_ok( $client,$templ, 4 ); } #---------------------------------------------------------------------------- # # pretty_number - format a number with ,s every 1000 # # $number The number to format # #---------------------------------------------------------------------------- sub pretty_number { my ( $self, $number ) = @_; my $c = reverse $self->{language__}{Locale_Thousands}; $number = reverse $number; $number =~ s/(\d{3})/$1$c/g; $number = reverse $number; $c =~ s/\./\\./g; $number =~ s/^$c(.*)/$1/; return $number; } #---------------------------------------------------------------------------- # # pretty_date__ - format a date as the user wants to see it # # $date Epoch seconds # $long Set to 1 if you want only the long date option # #---------------------------------------------------------------------------- sub pretty_date__ { my ( $self, $date, $long ) = @_; $long = 0 if ( !defined( $long ) ); my $format = $self->config_( 'date_format' ); if ( $format eq '' ) { $format = $self->{language__}{Locale_Date}; } if ( $format =~ /[\t ]*(.+)[\t ]*\|[\t ]*(.+)/ ) { if ( ( $date < time ) && # PROFILE BLOCK START ( $date > ( time - ( 7 * 24 * 60 * 60 ) ) ) ) { # PROFILE BLOCK STOP if ( $long ) { return time2str( $2, $date ); } else { return time2str( $1, $date ); } } else { return time2str( $2, $date ); } } else { return time2str( $format, $date ); } } #---------------------------------------------------------------------------- # # advanced_page - very advanced configuration options # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub advanced_page { use Cwd 'abs_path'; my ( $self, $client, $templ ) = @_; # Handle updating the parameter table if ( defined( $self->{form_}{update_params} ) ) { foreach my $param (sort keys %{$self->{form_}}) { if ( $param =~ /parameter_(.*)/ ) { $self->{configuration__}->parameter( $1, # PROFILE BLOCK START $self->{form_}{$param} ); # PROFILE BLOCK STOP } } $self->{configuration__}->save_configuration(); } # Handle adding/removing words to/from stopwords if ( defined($self->{form_}{newword}) ) { my $result = $self->{c__}->add_stopword( $self->{api_session__}, # PROFILE BLOCK START $self->{form_}{newword} ); # PROFILE BLOCK STOP if ( $result == 0 ) { $templ->param( 'Advanced_If_Add_Message' => 1 ); } } if ( defined($self->{form_}{word}) ) { my $result = $self->{c__}->remove_stopword( $self->{api_session__}, # PROFILE BLOCK START $self->{form_}{word} ); # PROFILE BLOCK STOP if ( $result == 0 ) { $templ->param( 'Advanced_If_Delete_Message' => 1 ); } } # the word census ( stopwords ) my $last = ''; my $need_comma = 0; my $groupCounter = 0; my $groupSize = 5; my @words = $self->{c__}->get_stopword_list( $self->{api_session__} ); my $commas; my @word_loop; my $c; @words = sort @words; push ( @words, ' ' ); for my $word (@words) { if ( $self->config_( 'language' ) =~ /^Korean$/ ) { $word =~ /^(.)/; $c = $1; } else { if ( $self->config_( 'language' ) =~ /^Nihongo$/ ) { $word =~ /^($euc_jp)/o; $c = $1; } else { $word =~ /^(.)/; $c = $1; } } $last = $c if ( $last eq '' ); if ( $c ne $last ) { my %row_data; $row_data{Advanced_Words} = $commas; $commas = ''; if ( $groupCounter == $groupSize ) { $row_data{Advanced_Row_Class} = 'advancedAlphabetGroupSpacing'; } else { $row_data{Advanced_Row_Class} = 'advancedAlphabet'; } $row_data{Advanced_Character} = $last; if ( $groupCounter == $groupSize ) { $row_data{Advanced_Word_Class} = 'advancedWordsGroupSpacing'; $groupCounter = 0; } else { $row_data{Advanced_Word_Class} = 'advancedWords'; } $last = $c; $need_comma = 0; $groupCounter += 1; push ( @word_loop, \%row_data ); } if ( $need_comma == 1 ) { $commas .= ", $word"; } else { $commas .= $word; $need_comma = 1; } } $templ->param( 'Advanced_Loop_Word' => \@word_loop ); my $config_file = $self->get_user_path_( 'popfile.cfg' ); if ( -e $config_file ) { $config_file = abs_path( $config_file ); } if ( ( $^O eq 'MSWin32' ) && # PROFILE BLOCK START ( $self->config_( 'language' ) eq 'Nihongo' ) ) { # PROFILE BLOCK STOP # Converts configuration file path to LanguageCharset require Encode; require File::Glob::Windows; Encode::from_to( $config_file, # PROFILE BLOCK START File::Glob::Windows::getCodePage(), $self->{language__}{LanguageCharset} ); # PROFILE BLOCK STOP } $templ->param( 'Advanced_POPFILE_CFG' => $config_file ); # POPFile global parameters my $last_module = ''; my @param_loop; foreach my $param ($self->{configuration__}->configuration_parameters()) { my $value = $self->{configuration__}->parameter( $param ); $param =~ /^([^_]+)_/; my %row_data; if ( ( $last_module ne '' ) && ( $last_module ne $1 ) ) { $row_data{Advanced_If_New_Module} = 1; } else { $row_data{Advanced_If_New_Module} = 0; } $last_module = $1; $row_data{Advanced_Parameter} = $param; $row_data{Advanced_Value} = $value; $row_data{Advanced_If_Changed} = # PROFILE BLOCK START !$self->{configuration__}->is_default( $param ); # PROFILE BLOCK STOP $row_data{Advanced_If_Password} = # PROFILE BLOCK START ( $param =~ /_password/ ) ? 1 : 0; # PROFILE BLOCK STOP push ( @param_loop, \%row_data); } $templ->param( 'Advanced_Loop_Parameter' => \@param_loop ); $self->http_ok( $client, $templ, 5 ); } sub max { my ( $a, $b ) = @_; return ( $a > $b )?$a:$b; } #---------------------------------------------------------------------------- # # magnet_page - the list of bucket magnets # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub magnet_page { my ( $self, $client, $templ ) = @_; my @messages = (); if ( defined( $self->{form_}{delete} ) ) { for my $i ( 1 .. $self->{form_}{count} ) { if ( defined( $self->{form_}{"remove$i"} ) && # PROFILE BLOCK START ( $self->{form_}{"remove$i"} ) ) { # PROFILE BLOCK STOP my $mtype = $self->{form_}{"type$i"}; my $mtext = $self->{form_}{"text$i"}; my $mbucket = $self->{form_}{"bucket$i"}; $self->{c__}->delete_magnet( $self->{api_session__}, $mbucket, $mtype, $mtext ); } } } if ( defined( $self->{form_}{count} ) && # PROFILE BLOCK START ( defined( $self->{form_}{update} ) || defined( $self->{form_}{create} ) ) ) { # PROFILE BLOCK STOP for my $i ( 0 .. $self->{form_}{count} ) { my $mtype = $self->{form_}{"type$i"}; my $mtext = $self->{form_}{"text$i"}; my $mbucket = $self->{form_}{"bucket$i"}; if ( defined( $self->{form_}{update} ) ) { my $otype = $self->{form_}{"otype$i"}; my $otext = $self->{form_}{"otext$i"}; my $obucket = $self->{form_}{"obucket$i"}; if ( defined( $otype ) ) { $self->{c__}->delete_magnet( $self->{api_session__}, # PROFILE BLOCK START $obucket, $otype, $otext ); # PROFILE BLOCK STOP } } if ( ( defined($mbucket) ) && # PROFILE BLOCK START ( $mbucket ne '' ) && ( $mtext ne '' ) ) { # PROFILE BLOCK STOP # Support for feature request 77646 - import function. # goal is a method of creating multiple magnets all # with the same target bucket quickly. # # If we have multiple lines in $mtext, each line will # actually be used to create a new magnet all with the # same target. We loop through all of the requested # magnets, check to make sure they are all valid (not # already existing, etc...) and then loop through them # again to create them. this way, if even one isn't # valid, none will be created. # # We also get rid of an \r's that may have been passed # in. We also and ignore lines containing, only white # space and if a line is repeated we add just one # bucket for it. $mtext =~ s/\r\n/\n/g; my @all_mtexts = split(/\n/,$mtext); my %mtext_hash; @mtext_hash{@all_mtexts} = (); my @mtexts = keys %mtext_hash; my $found = 0; my %row_data; foreach my $current_mtext (@mtexts) { for my $bucket ($self->{c__}->get_buckets_with_magnets( # PROFILE BLOCK START $self->{api_session__} )) { # PROFILE BLOCK STOP my %magnets; @magnets{ $self->{c__}->get_magnets( # PROFILE BLOCK START $self->{api_session__}, $bucket, $mtype )} = (); # PROFILE BLOCK STOP if ( exists( $magnets{$current_mtext} ) ) { $found = 1; $row_data{Magnet_Message} = # PROFILE BLOCK START sprintf( $self->{language__}{Magnet_Error1}, "$mtype: $current_mtext", $bucket ); # PROFILE BLOCK STOP push( @messages, \%row_data ); last; } } if ( $found == 0 ) { for my $bucket ($self->{c__}->get_buckets_with_magnets( $self->{api_session__} )) { my %magnets; @magnets{ $self->{c__}->get_magnets( $self->{api_session__}, $bucket, $mtype )} = (); for my $from (keys %magnets) { if ( ( $self->{c__}->single_magnet_match( $mtext, $from, $mtype ) ) || # PROFILE BLOCK START ( $self->{c__}->single_magnet_match( $from, $mtext, $mtype ) ) ) { # PROFILE BLOCK STOP $found = 1; $row_data{Magnet_Message} = # PROFILE BLOCK START sprintf( $self->{language__}{Magnet_Error2}, "$mtype: $current_mtext", "$mtype: $from", $bucket ); # PROFILE BLOCK STOP push( @messages, \%row_data ); last; } } } } } if ( $found == 0 ) { foreach my $current_mtext (@mtexts) { # Skip magnet definition if it consists only of # white spaces if ( $current_mtext =~ /^[ \t]*$/ ) { next; } # It is possible to type leading or trailing white # space in a magnet definition which can later # cause mysterious failures because the whitespace # is eaten by the browser when the magnet is # displayed but is matched in the regular # expression that does the magnet matching and # will cause failures... so strip off the # whitespace $current_mtext =~ s/^[ \t]+//; $current_mtext =~ s/[ \t]+$//; $self->{c__}->create_magnet( $self->{api_session__}, $mbucket, $mtype, $current_mtext ); if ( !defined( $self->{form_}{update} ) ) { $row_data{Magnet_Message} = # PROFILE BLOCK START sprintf( $self->{language__}{Magnet_Error3}, "$mtype: $current_mtext", $mbucket ); # PROFILE BLOCK STOP push( @messages, \%row_data ); } } } } } } if ( scalar @messages > 0 ) { $templ->param( 'Magnet_If_Message' => 1 ); $templ->param( 'Magnet_Loop_Messages' => \@messages ); } # Current Magnets panel my $start_magnet = $self->{form_}{start_magnet}; my $stop_magnet = $self->{form_}{stop_magnet}; my $magnet_count = $self->{c__}->magnet_count( $self->{api_session__} ); my $navigator = ''; if ( !defined( $start_magnet ) ) { $start_magnet = 0; } if ( !defined( $stop_magnet ) ) { $stop_magnet = $start_magnet + $self->config_( 'page_size' ) - 1; } if ( $self->config_( 'page_size' ) < $magnet_count ) { $self->set_magnet_navigator__( $templ, $start_magnet, # PROFILE BLOCK START $stop_magnet, $magnet_count ); # PROFILE BLOCK STOP } $templ->param( 'Magnet_Start_Magnet' => $start_magnet ); my %magnet_types = $self->{c__}->get_magnet_types( $self->{api_session__} ); my $i = 0; my $count = -1; my @magnet_type_loop; foreach my $type (keys %magnet_types) { my %row_data; $row_data{Magnet_Type} = $type; $row_data{Magnet_Type_Name} = $magnet_types{$type}; push ( @magnet_type_loop, \%row_data ); } $templ->param( 'Magnet_Loop_Types' => \@magnet_type_loop ); my @buckets = $self->{c__}->get_buckets( $self->{api_session__} ); my @magnet_bucket_loop; foreach my $bucket (@buckets) { my %row_data; my $bcolor = $self->{c__}->get_bucket_color( $self->{api_session__}, $bucket ); $row_data{Magnet_Bucket} = $bucket; $row_data{Magnet_Bucket_Color} = $bcolor; push ( @magnet_bucket_loop, \%row_data ); } $templ->param( 'Magnet_Loop_Buckets' => \@magnet_bucket_loop ); # magnet listing my @magnet_loop; for my $bucket ($self->{c__}->get_buckets_with_magnets( $self->{api_session__} )) { for my $type ($self->{c__}->get_magnet_types_in_bucket( $self->{api_session__}, $bucket )) { for my $magnet ($self->{c__}->get_magnets( $self->{api_session__}, $bucket, $type )) { my %row_data; $count += 1; if ( ( $count < $start_magnet ) || ( $count > $stop_magnet ) ) { next; } $i += 1; # to validate, must replace & with & stan todo # note: come up with a smarter regex, this one's a # bludgeon another todo: Move this stuff into a # function to make text safe for inclusion in a form # field my $validatingMagnet = $magnet; $validatingMagnet =~ s/&/&/g; $validatingMagnet =~ s//>/g; # escape quotation characters to avoid orphan data # within tags todo: function to make arbitrary data # safe for inclusion within a html tag attribute # (inside double-quotes) $validatingMagnet =~ s/\"/\"\;/g; $row_data{Magnet_Row_ID} = $i; $row_data{Magnet_Bucket} = $bucket; $row_data{Magnet_MType} = $type; $row_data{Magnet_Validating} = $validatingMagnet; $row_data{Magnet_Size} = max(length($magnet),50); my @type_loop; for my $mtype (keys %magnet_types) { my %type_data; my $selected = ( $mtype eq $type )?"selected":""; $type_data{Magnet_Type_Name} = $mtype; $type_data{Magnet_Type_Localized} = $self->{language__}{$magnet_types{$mtype}}; $type_data{Magnet_Type_Selected} = $selected; push ( @type_loop, \%type_data ); } $row_data{Magnet_Loop_Loop_Types} = \@type_loop; my @bucket_loop; my @buckets = $self->{c__}->get_buckets( $self->{api_session__} ); foreach my $mbucket (@buckets) { my %bucket_data; my $selected = ( $bucket eq $mbucket )?"selected":""; my $bcolor = $self->{c__}->get_bucket_color( $self->{api_session__}, $mbucket ); $bucket_data{Magnet_Bucket_Bucket} = $mbucket; $bucket_data{Magnet_Bucket_Color} = $bcolor; $bucket_data{Magnet_Bucket_Selected} = $selected; push ( @bucket_loop, \%bucket_data ); } $row_data{Magnet_Loop_Loop_Buckets} = \@bucket_loop; push ( @magnet_loop, \%row_data ); } } } $templ->param( 'Magnet_Loop_Magnets' => \@magnet_loop ); $templ->param( 'Magnet_Count_Magnet' => $i ); $self->http_ok( $client, $templ, 2 ); } #---------------------------------------------------------------------------- # # bucket_page - information about a specific bucket # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub bucket_page { my ( $self, $client, $templ ) = @_; my $bucket = $self->{form_}{showbucket}; $templ = $self->load_template__( 'bucket-page.thtml' ); my $color = $self->{c__}->get_bucket_color( $self->{api_session__}, $bucket ); $templ->param( 'Bucket_Main_Title' => sprintf( $self->{language__}{SingleBucket_Title}, "$bucket" ) ); my $bucket_count = $self->{c__}->get_bucket_word_count( $self->{api_session__}, $bucket ); $templ->param( 'Bucket_Word_Count' => $self->pretty_number( $bucket_count ) ); $templ->param( 'Bucket_Unique_Count' => sprintf( $self->{language__}{SingleBucket_Unique}, $self->pretty_number( $self->{c__}->get_bucket_unique_count( $self->{api_session__}, $bucket ) ) ) ); $templ->param( 'Bucket_Total_Word_Count' => $self->pretty_number( $self->{c__}->get_word_count( $self->{api_session__} ) || 0 ) ); $templ->param( 'Bucket_Bucket' => $bucket ); my $percent = '0%'; if ( $self->{c__}->get_word_count( $self->{api_session__} ) > 0 ) { $percent = sprintf( '%6.2f%%', int( 10000 * $bucket_count / $self->{c__}->get_word_count( $self->{api_session__} ) ) / 100 ); } $templ->param( 'Bucket_Percentage' => $percent ); if ( $self->{c__}->get_bucket_word_count( $self->{api_session__}, $bucket ) > 0 ) { $templ->param( 'Bucket_If_Has_Words' => 1 ); my @letter_data; for my $i ($self->{c__}->get_bucket_word_prefixes( $self->{api_session__}, $bucket )) { my %row_data; $row_data{Bucket_Letter} = $i; $row_data{Bucket_Bucket} = $bucket; $row_data{Session_Key} = $self->{session_key__}; if ( defined( $self->{form_}{showletter} ) && ( $i eq $self->{form_}{showletter} ) ) { $row_data{Bucket_If_Show_Letter} = 1; } push ( @letter_data, \%row_data ); } $templ->param( 'Bucket_Loop_Letters' => \@letter_data ); if ( defined( $self->{form_}{showletter} ) ) { my $letter = $self->{form_}{showletter}; $templ->param( 'Bucket_If_Show_Letter' => 1 ); $templ->param( 'Bucket_Word_Table_Title' => # PROFILE BLOCK START sprintf( $self->{language__}{SingleBucket_WordTable}, $bucket ) ); # PROFILE BLOCK STOP $templ->param( 'Bucket_Letter' => $letter ); my %word_count; for my $j ( $self->{c__}->get_bucket_word_list( $self->{api_session__}, $bucket, $letter ) ) { $word_count{$j} = $self->{c__}->get_count_for_word( $self->{api_session__}, $bucket, $j ); } my @words = sort { $word_count{$b} <=> $word_count{$a} || $a cmp $b } keys %word_count; my @rows; while ( @words ) { my %row_data; my @cols; for ( 1 .. 6 ) { my %cell_data; my $word = shift @words; $cell_data{'Bucket_Word'} = $word; $cell_data{'Bucket_Word_Count'} = $word_count{$word}; $cell_data{'Session_Key'} = $self->{session_key__}; push @cols, \%cell_data; last unless @words; } $row_data{'Bucket_Loop_Column'} = \@cols; push @rows, \%row_data; } $templ->param( 'Bucket_Loop_Row' => \@rows ); } } $self->http_ok( $client, $templ, 1 ); } #---------------------------------------------------------------------------- # # bar_chart_100 - Output an HTML bar chart # # %values A hash of bucket names with values in series 0, 1, 2, ... # #---------------------------------------------------------------------------- sub bar_chart_100 { my ( $self, %values ) = @_; my $templ = $self->load_template__( 'bar-chart-widget.thtml' ); my $total_count = 0; my @xaxis = sort { if ( $self->{c__}->is_pseudo_bucket( $self->{api_session__}, $a ) == $self->{c__}->is_pseudo_bucket( $self->{api_session__}, $b ) ) { $a cmp $b; } else { $self->{c__}->is_pseudo_bucket( $self->{api_session__}, $a ) <=> $self->{c__}->is_pseudo_bucket( $self->{api_session__}, $b ); } } keys %values; return '' if ( $#xaxis < 0 ); my @series = sort keys %{$values{$xaxis[0]}}; for my $bucket (@xaxis) { $total_count += $values{$bucket}{0}; } my @bucket_data; for my $bucket (@xaxis) { my %bucket_row_data; $bucket_row_data{bar_bucket_color} = $self->{c__}->get_bucket_color( $self->{api_session__}, $bucket ); $bucket_row_data{bar_bucket_name} = $bucket; my @series_data; for my $s (@series) { my %series_row_data; my $value = $values{$bucket}{$s} || 0; my $count = $self->pretty_number( $value ); my $percent = ''; if ( $s == 0 ) { my $d = $self->{language__}{Locale_Decimal}; if ( $total_count == 0 ) { $percent = " ( 0$d" . "00%)"; } else { $percent = sprintf( " (%.2f%%)", int( $value * 10000 / $total_count ) / 100 ); $percent =~ s/\./$d/; } } if ( ( $s == 2 ) && # PROFILE BLOCK START ( $self->{c__}->is_pseudo_bucket( $self->{api_session__}, $bucket ) ) ) { # PROFILE BLOCK STOP $count = ''; $percent = ''; } $series_row_data{bar_count} = $count; $series_row_data{bar_percent} = $percent; push @series_data, \%series_row_data; } $bucket_row_data{bar_loop_series} = \@series_data; push @bucket_data, \%bucket_row_data; } $templ->param( 'bar_loop_xaxis' => \@bucket_data ); $templ->param( 'bar_colspan' => 3 + $#series ); if ( $total_count != 0 ) { $templ->param( 'bar_if_total_count' => 1 ); @bucket_data = (); foreach my $bucket (@xaxis) { my %bucket_row_data; my $percent = sprintf "%.2f", ( $values{$bucket}{0} * 10000 / $total_count ) / 100; if ( $percent != 0 ) { $bucket_row_data{bar_if_percent} = 1; $bucket_row_data{bar_bucket_color} = $self->{c__}->get_bucket_color( $self->{api_session__}, $bucket ); $bucket_row_data{bar_bucket_name2} = $bucket; $bucket_row_data{bar_width} = $percent; } else { $bucket_row_data{bar_if_percent} = 0; } push @bucket_data, \%bucket_row_data; } $templ->param( 'bar_loop_total_xaxis' => \@bucket_data ); } else { $templ->param( 'bar_if_total_count' => 0 ); } return $templ->output(); } #---------------------------------------------------------------------------- # # corpus_page - the corpus management page # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub corpus_page { my ( $self, $client, $templ ) = @_; my $session = $self->{api_session__}; if ( defined( $self->{form_}{clearbucket} ) ) { $self->{c__}->clear_bucket( $session, # PROFILE BLOCK START $self->{form_}{showbucket} ); # PROFILE BLOCK STOP } if ( defined($self->{form_}{reset_stats}) ) { foreach my $bucket ($self->{c__}->get_all_buckets( $session )) { $self->set_bucket_parameter__( $bucket, 'count', 0 ); $self->set_bucket_parameter__( $bucket, 'fpcount', 0 ); $self->set_bucket_parameter__( $bucket, 'fncount', 0 ); } my $lasttime = localtime; $self->config_( 'last_reset', $lasttime ); $self->{configuration__}->save_configuration(); } if ( defined($self->{form_}{showbucket}) ) { $self->bucket_page( $client, $templ ); return; } # This regular expression defines the characters that are NOT valid # within a bucket name my $invalid_bucket_chars = '[^[:lower:]\-_0-9]'; if ( ( defined($self->{form_}{cname}) ) && ( $self->{form_}{cname} ne '' ) ) { if ( $self->{form_}{cname} =~ /$invalid_bucket_chars/ ) { $templ->param( 'Corpus_If_Create_Error' => 1 ); } else { if ( $self->{c__}->is_bucket( $session, $self->{form_}{cname} ) || # PROFILE BLOCK START $self->{c__}->is_pseudo_bucket( $session, $self->{form_}{cname} ) ) { # PROFILE BLOCK STOP $templ->param( 'Corpus_If_Create_Message' => 1 ); $templ->param( 'Corpus_Create_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_Error2}, $self->{form_}{cname} ) ); # PROFILE BLOCK STOP } else { $self->{c__}->create_bucket( $session, $self->{form_}{cname} ); $templ->param( 'Corpus_If_Create_Message' => 1 ); $templ->param( 'Corpus_Create_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_Error3}, $self->{form_}{cname} ) ); # PROFILE BLOCK STOP } } } if ( ( defined($self->{form_}{delete}) ) && ( $self->{form_}{name} ne '' ) ) { $self->{form_}{name} = lc($self->{form_}{name}); $self->{c__}->delete_bucket( $session, $self->{form_}{name} ); $templ->param( 'Corpus_If_Delete_Message' => 1 ); $templ->param( 'Corpus_Delete_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_Error6}, $self->{form_}{name} ) ); # PROFILE BLOCK STOP } if ( ( defined($self->{form_}{newname}) ) && # PROFILE BLOCK START ( $self->{form_}{oname} ne '' ) ) { # PROFILE BLOCK STOP if ( ( $self->{form_}{newname} eq '' ) || # PROFILE BLOCK START ( $self->{form_}{newname} =~ /$invalid_bucket_chars/ ) ) { # PROFILE BLOCK STOP $templ->param( 'Corpus_If_Rename_Error' => 1 ); } else { $self->{form_}{oname} = lc($self->{form_}{oname}); $self->{form_}{newname} = lc($self->{form_}{newname}); if ( $self->{c__}->rename_bucket( $session, $self->{form_}{oname}, $self->{form_}{newname} ) == 1 ) { $templ->param( 'Corpus_If_Rename_Message' => 1 ); $templ->param( 'Corpus_Rename_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_Error5}, $self->{form_}{oname}, $self->{form_}{newname} ) ); # PROFILE BLOCK STOP } else { $templ->param( 'Corpus_If_Rename_Message' => 1 ); $templ->param( 'Corpus_Rename_Message' => 'Internal error: rename failed' ); } } } my @buckets = $self->{c__}->get_buckets( $session ); my $total_count = 0; my @delete_data; my @rename_data; foreach my $bucket (@buckets) { my %delete_row; my %rename_row; $delete_row{Corpus_Delete_Bucket} = $bucket; $delete_row{Corpus_Delete_Bucket_Color} = $self->get_bucket_parameter__( $bucket, 'color' ); $rename_row{Corpus_Rename_Bucket} = $bucket; $rename_row{Corpus_Rename_Bucket_Color} = $self->get_bucket_parameter__( $bucket, 'color' ); $total_count += $self->get_bucket_parameter__( $bucket, 'count' ); push ( @delete_data, \%delete_row ); push ( @rename_data, \%rename_row ); } $templ->param( 'Corpus_Loop_Delete_Buckets' => \@delete_data ); $templ->param( 'Corpus_Loop_Rename_Buckets' => \@rename_data ); my @pseudos = $self->{c__}->get_pseudo_buckets( $session ); push @buckets, @pseudos; # Check whether the user requested any changes to the per-bucket settings if ( defined($self->{form_}{bucket_settings}) ) { my @parameters = qw/subject xtc xpl quarantine/; foreach my $bucket ( @buckets ) { foreach my $variable ( @parameters ) { my $bucket_param = $self->get_bucket_parameter__( $bucket, $variable ); my $form_param = ( $self->{form_}{"${bucket}_$variable"} ) ? 1 : 0; if ( $form_param ne $bucket_param ) { $self->set_bucket_parameter__( $bucket, $variable, $form_param ); } } # Since color isn't coded binary and only used for # non-pseudo buckets, we have to handle it separately unless ( $self->{c__}->is_pseudo_bucket( $session, $bucket ) ) { my $bucket_color = $self->get_bucket_parameter__( $bucket, 'color' ); my $form_color = $self->{form_}{"${bucket}_color"}; if ( defined($form_color) && ( $form_color ne $bucket_color ) ) { $self->set_bucket_parameter__( $bucket, 'color', $form_color ); } } } } my @corpus_data; foreach my $bucket ( @buckets ) { my %row_data; $row_data{Corpus_Bucket} = $bucket; $row_data{Corpus_Bucket_Color} = $self->get_bucket_parameter__( $bucket, 'color' ); $row_data{Corpus_Bucket_Unique} = $self->pretty_number( $self->{c__}->get_bucket_unique_count( $session, $bucket ) ); $row_data{Corpus_If_Bucket_Not_Pseudo} = !$self->{c__}->is_pseudo_bucket( $session, $bucket ); $row_data{Corpus_If_Subject} = $self->get_bucket_parameter__( $bucket, 'subject' ); $row_data{Corpus_If_XTC} = $self->get_bucket_parameter__( $bucket, 'xtc' ); $row_data{Corpus_If_XPL} = $self->get_bucket_parameter__( $bucket, 'xpl' ); $row_data{Corpus_If_Quarantine} = $self->get_bucket_parameter__( $bucket, 'quarantine' ); my @color_data; foreach my $color (@{$self->{c__}->{possible_colors__}} ) { my %color_row; $color_row{Corpus_Available_Color} = $color; $color_row{Corpus_Color_Selected} = ( $row_data{Corpus_Bucket_Color} eq $color )?'selected':''; push ( @color_data, \%color_row ); } $row_data{Session_Key} = $self->{session_key__}; $row_data{Corpus_Loop_Loop_Colors} = \@color_data; push ( @corpus_data, \%row_data ); } $templ->param( 'Corpus_Loop_Buckets' => \@corpus_data ); my %bar_values; for my $bucket (@buckets) { $bar_values{$bucket}{0} = $self->get_bucket_parameter__( $bucket, 'count' ); $bar_values{$bucket}{1} = $self->get_bucket_parameter__( $bucket, 'fpcount' ); $bar_values{$bucket}{2} = $self->get_bucket_parameter__( $bucket, 'fncount' ); } $templ->param( 'Corpus_Bar_Chart_Classification' => $self->bar_chart_100( %bar_values ) ); @buckets = $self->{c__}->get_buckets( $session ); delete $bar_values{unclassified}; for my $bucket (@buckets) { $bar_values{$bucket}{0} = $self->{c__}->get_bucket_word_count( $session, $bucket ); delete $bar_values{$bucket}{1}; delete $bar_values{$bucket}{2}; } $templ->param( 'Corpus_Bar_Chart_Word_Counts' => $self->bar_chart_100( %bar_values ) ); my $number = $self->pretty_number( $self->{c__}->get_unique_word_count( $session ) ); $templ->param( 'Corpus_Total_Unique' => $number ); my $pmcount = $self->pretty_number( $self->mcount__() ); $templ->param( 'Corpus_Message_Count' => $pmcount ); my $pecount = $self->pretty_number( $self->ecount__() ); $templ->param( 'Corpus_Error_Count' => $pecount ); my $accuracy = $self->{language__}{Bucket_NotEnoughData}; my $percent = 0; if ( $self->mcount__() > $self->ecount__() ) { $percent = int( 10000 * ( $self->mcount__() - $self->ecount__() ) / $self->mcount__() ) / 100; $accuracy = "$percent%"; } $templ->param( 'Corpus_Accuracy' => $accuracy ); $templ->param( 'Corpus_If_Last_Reset' => 1 ); $templ->param( 'Corpus_Last_Reset' => $self->config_( 'last_reset' ) ); if ( ( defined($self->{form_}{lookup}) ) || # PROFILE BLOCK START ( defined($self->{form_}{word}) && ( $self->{form_}{word} ne '' ) ) ) { # PROFILE BLOCK STOP $templ->param( 'Corpus_If_Looked_Up' => 1 ); $templ->param( 'Corpus_Word' => $self->{form_}{word} ); my $word = $self->{form_}{word}; if ( !( $word =~ /^[A-Za-z0-9\-_]+:/ ) ) { $word = $self->{c__}->{parser__}->{mangle__}->mangle( $word, 1 ); } if ( !$word ) { $templ->param( 'Corpus_Lookup_Message' => # PROFILE BLOCK START sprintf $self->{language__}{Bucket_InIgnoredWords}, $self->{form_}{word} ); # PROFILE BLOCK STOP } else { my $max = 0; my $max_bucket = ''; my $total = 0; foreach my $bucket (@buckets) { my $val = $self->{c__}->get_value_( $session, $bucket, $word ); if ( $val != 0 ) { my $prob = exp( $val ); $total += $prob; if ( $prob > $max ) { $max = $prob; $max_bucket = $bucket; } } else { # Take into account the probability the Bayes # calculation applies for the buckets in which the # word is not found. $total += exp( $self->{c__}->get_not_likely_( $session ) ); } } my @lookup_data; foreach my $bucket (@buckets) { my $val = $self->{c__}->get_value_( $session, $bucket, $word ); if ( $val != 0 ) { my %row_data; my $prob = exp( $val ); my $n = ($total > 0)?$prob / $total:0; my $score = ($#buckets >= 0)?($val - $self->{c__}->get_not_likely_( $session ) )/log(10.0):0; my $d = $self->{language__}{Locale_Decimal}; my $normal = sprintf("%.10f", $n); $normal =~ s/\./$d/; $score = sprintf("%.10f", $score); $score =~ s/\./$d/; my $probf = sprintf("%.10f", $prob); $probf =~ s/\./$d/; my $bold = ''; my $endbold = ''; if ( $score =~ /^[^\-]/ ) { $score = " $score"; } $row_data{Corpus_If_Most_Likely} = ( $max == $prob ); $row_data{Corpus_Bucket} = $bucket; $row_data{Corpus_Bucket_Color} = $self->get_bucket_parameter__( $bucket, 'color' ); $row_data{Corpus_Probability} = $probf; $row_data{Corpus_Normal} = $normal; $row_data{Corpus_Score} = $score; push ( @lookup_data, \%row_data ); } } $templ->param( 'Corpus_Loop_Lookup' => \@lookup_data ); if ( $max_bucket ne '' ) { $templ->param( 'Corpus_Lookup_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_LookupMostLikely}, $word, $self->{c__}->get_bucket_color( $session, $max_bucket ), $max_bucket ) ); # PROFILE BLOCK STOP } else { $templ->param( 'Corpus_Lookup_Message' => # PROFILE BLOCK START sprintf( $self->{language__}{Bucket_DoesNotAppear}, $word ) ); # PROFILE BLOCK STOP } } } $self->http_ok( $client, $templ, 1 ); } #---------------------------------------------------------------------------- # # compare_mf - Compares two mailfiles, used for sorting mail into order # #---------------------------------------------------------------------------- sub compare_mf { $a =~ /popfile(\d+)=(\d+)\.msg/; my ( $ad, $am ) = ( $1, $2 ); $b =~ /popfile(\d+)=(\d+)\.msg/; my ( $bd, $bm ) = ( $1, $2 ); if ( $ad == $bd ) { return ( $bm <=> $am ); } else { return ( $bd <=> $ad ); } } #---------------------------------------------------------------------------- # # set_history_navigator__ # # Fix up the history-navigator-widget.thtml template # # $templ - The template to fix up # $start_message - The number of the first message displayed # $stop_message - The number of the last message displayed # #---------------------------------------------------------------------------- sub set_history_navigator__ { my ( $self, $templ, $start_message, $stop_message ) = @_; $templ->param( 'History_Navigator_Fields' => $self->print_form_fields_(0,1,('session','filter','search','sort','negate' ) ) ); my $page_size = $self->config_( 'page_size' ); my $query_size = $self->{history__}->get_query_size( $self->{q__} ); if ( $start_message != 0 ) { $templ->param( 'History_Navigator_If_Previous' => 1 ); $templ->param( 'History_Navigator_Previous' => $start_message - $page_size ); } # Only show two pages either side of the current page, the first # page and the last page # # e.g. [1] ... [4] [5] [6] [7] [8] ... [24] my $i = 0; my $p = 1; my $dots = 0; my @nav_data; while ( $i < $query_size ) { my %row_data; if ( ( $i == 0 ) || # PROFILE BLOCK START ( ( $i + $page_size ) >= $query_size ) || ( ( ( $i - 2 * $page_size ) <= $start_message ) && ( ( $i + 2 * $page_size ) >= $start_message ) ) ) { # PROFILE BLOCK STOP $row_data{History_Navigator_Page} = $p; $row_data{History_Navigator_I} = $i; if ( $i == $start_message ) { $row_data{History_Navigator_If_This_Page} = 1; } else { $row_data{History_Navigator_Fields} = $self->print_form_fields_(0,1,('session','filter','search','sort','negate')); } $dots = 1; } else { $row_data{History_Navigator_If_Spacer} = 1; if ( $dots ) { $row_data{History_Navigator_If_Dots} = 1; } $dots = 0; } $i += $page_size; $p++; push ( @nav_data, \%row_data ); } $templ->param( 'History_Navigator_Loop' => \@nav_data ); if ( $start_message < ( $query_size - $page_size ) ) { $templ->param( 'History_Navigator_If_Next' => 1 ); $templ->param( 'History_Navigator_Next' => $start_message + $page_size ); } } #---------------------------------------------------------------------------- # # set_magnet_navigator__ # # Sets the magnet navigator up in a template # # $templ - The loaded Magnet page template # $start_magnet - The number of the first magnet # $stop_magnet - The number of the last magnet # $magnet_count - Total number of magnets # #---------------------------------------------------------------------------- sub set_magnet_navigator__ { my ( $self, $templ, $start_magnet, $stop_magnet, $magnet_count ) = @_; my $page_size = $self->config_( 'page_size' ); if ( $start_magnet != 0 ) { $templ->param( 'Magnet_Navigator_If_Previous' => 1 ); $templ->param( 'Magnet_Navigator_Previous' => $start_magnet - $page_size ); } my $i = 0; my $count = 0; my @page_loop; while ( $i < $magnet_count ) { $templ->param( 'Magnet_Navigator_Enabled' => 1 ); my %row_data; $count += 1; $row_data{Magnet_Navigator_Count} = $count; $row_data{Session_Key} = $self->{session_key__}; if ( $i == $start_magnet ) { $row_data{Magnet_Navigator_If_This_Page} = 1; } else { $row_data{Magnet_Navigator_If_This_Page} = 0; $row_data{Magnet_Navigator_Start_Magnet} = $i; } $i += $page_size; push ( @page_loop, \%row_data ); } $templ->param( 'Magnet_Navigator_Loop_Pages' => \@page_loop ); if ( $start_magnet < ( $magnet_count - $page_size ) ) { $templ->param( 'Magnet_Navigator_If_Next' => 1 ); $templ->param( 'Magnet_Navigator_Next' => $start_magnet + $page_size ); } } #---------------------------------------------------------------------------- # # history_reclassify - handle the reclassification of messages on the # history page # #---------------------------------------------------------------------------- sub history_reclassify { my ( $self ) = @_; if ( defined( $self->{form_}{change} ) ) { # Look for all entries in the form of the form reclassify_X # and see if they have values, those that have values indicate # a reclassification # Set up %messages to map a slot ID to the new bucket my %messages; foreach my $key (keys %{$self->{form_}}) { if ( $key =~ /^reclassify_([0-9]+)$/ ) { if ( defined( $self->{form_}{$key} ) && # PROFILE BLOCK START ( $self->{form_}{$key} ne '' ) ) { # PROFILE BLOCK STOP $messages{$1} = $self->{form_}{$key}; } } } my %work; while ( my ( $slot, $newbucket ) = each %messages ) { push @{$work{$newbucket}}, # PROFILE BLOCK START $self->{history__}->get_slot_file( $slot ); # PROFILE BLOCK STOP my @fields = $self->{history__}->get_slot_fields( $slot ); my $bucket = $fields[8]; $self->{c__}->reclassified( # PROFILE BLOCK START $self->{api_session__}, $bucket, $newbucket, 0 ); # PROFILE BLOCK STOP $self->{history__}->change_slot_classification( # PROFILE BLOCK START $slot, $newbucket, $self->{api_session__}, 0); # PROFILE BLOCK STOP $self->{feedback}{$slot} = sprintf( # PROFILE BLOCK START $self->{language__}{History_ChangedTo}, $self->{c__}->get_bucket_color( $self->{api_session__}, $newbucket ), $newbucket ); # PROFILE BLOCK STOP } # At this point the work hash maps the buckets to lists of # files to reclassify, so run through them doing bulk updates foreach my $newbucket (keys %work) { $self->{c__}->add_messages_to_bucket( $self->{api_session__}, $newbucket, @{$work{$newbucket}} ); } } } #---------------------------------------------------------------------------- # # history_undo - handle undoing of reclassifications of messages on # the history page # #---------------------------------------------------------------------------- sub history_undo { my( $self ) = @_; # Look for all entries in the form of the form undo_X and see if # they have values, those that have values indicate a # reclassification foreach my $key (keys %{$self->{form_}}) { if ( $key =~ /^undo_([0-9]+)$/ ) { my $slot = $1; my @fields = $self->{history__}->get_slot_fields( $slot ); my $bucket = $fields[8]; my $newbucket = $self->{c__}->get_bucket_name( # PROFILE BLOCK START $self->{api_session__}, $fields[9] ); # PROFILE BLOCK STOP $self->{c__}->reclassified( # PROFILE BLOCK START $self->{api_session__}, $newbucket, $bucket, 1 ); # PROFILE BLOCK STOP $self->{history__}->change_slot_classification( # PROFILE BLOCK START $slot, $newbucket, $self->{api_session__}, 1 ); # PROFILE BLOCK STOP $self->{c__}->remove_message_from_bucket( # PROFILE BLOCK START $self->{api_session__}, $bucket, $self->{history__}->get_slot_file( $slot ) ); # PROFILE BLOCK STOP } } } #---------------------------------------------------------------------------- # # history_page - get the message classification history page # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub history_page { my ( $self, $client, $templ ) = @_; # Set up default values for various form elements that have been # passed in or not so that we don't have to worry about undefined # values later on in the function $self->{form_}{sort} = $self->{old_sort__} || '-inserted' if ( !defined( $self->{form_}{sort} ) ); $self->{form_}{search} = (!defined($self->{form_}{setsearch})?$self->{old_search__}:'') || '' if ( !defined( $self->{form_}{search} ) ); $self->{form_}{filter} = (!defined($self->{form_}{setfilter})?$self->{old_filter__}:'') || '' if ( !defined( $self->{form_}{filter} ) ); # If the user hits the Reset button on a search then we need to # clear the search value but make it look as though they hit the # search button so that sort_filter_history will get called below # to get the right values in history_keys if ( defined( $self->{form_}{reset_filter_search} ) ) { $self->{form_}{filter} = ''; $self->{form_}{negate} = ''; delete $self->{form_}{negate_array}; $self->{form_}{search} = ''; $self->{form_}{setsearch} = 1; } # If the user is asking for a new sort option then it needs to get # stored in the sort form variable so that it can be used for # subsequent page views of the History to keep the sort in place $self->{form_}{sort} = $self->{form_}{setsort} if ( defined( $self->{form_}{setsort} ) ); # Cache some values to keep interface widgets updated if history # is re-accessed without parameters $self->{old_sort__} = $self->{form_}{sort}; # We are using a checkbox for negate, so we have to use an empty # hidden input of the same name and check for multiple occurences # or any of the name being defined if ( !defined( $self->{form_}{negate} ) ) { # if none of our negate inputs are active, # this is a "clean" access of the history $self->{form_}{negate} = $self->{old_negate__} || ''; } elsif ( defined( $self->{form_}{negate_array} ) ) { for ( @{$self->{form_}{negate_array}} ) { if ($_ ne '') { $self->{form_}{negate} = 'on'; $self->{old_negate__} = 'on'; last; } } } else { # We have a negate form, but no array.. this is likely the # hidden input, so this is not a "clean" visit $self->{old_negate__} = $self->{form_}{negate}; } # Information from submit buttons isn't always preserved if the # buttons aren't pressed. This compares values in some fields and # sets the button-values as though they had been pressed # Set setsearch if search changed and setsearch is undefined $self->{form_}{setsearch} = 'on' if ( ( ( !defined($self->{old_search__}) && ($self->{form_}{search} ne '') ) || ( defined($self->{old_search__}) && ( $self->{old_search__} ne $self->{form_}{search} ) ) ) && !defined($self->{form_}{setsearch} ) ); $self->{old_search__} = $self->{form_}{search}; # Set setfilter if filter changed and setfilter is undefined $self->{form_}{setfilter} = 'Filter' if ( ( ( !defined($self->{old_filter__}) && ($self->{form_}{filter} ne '') ) || ( defined($self->{old_filter__}) && ( $self->{old_filter__} ne $self->{form_}{filter} ) ) ) && !defined($self->{form_}{setfilter} ) ); $self->{old_filter__} = $self->{form_}{filter}; # Set up the text that will appear at the top of the history page # indicating the current filter and search settings my $filter = $self->{form_}{filter}; # Handle the reinsertion of a message file or the user hitting the # undo button $self->history_reclassify(); $self->history_undo(); # Handle removal of one or more items from the history page. Two # important possibilities: # # clearpage is defined: this will delete everything on the page # which means we will call delete_slot in the history with the ID # of ever message displayed. The IDs are encoded in the hidden # rowid_* form elements. # # clearchecked is defined: this will delete the messages that are # checked (i.e. the check box has been clicked). The check box is # called remove_* in the form_ hash once we get here. # # The third possibility is clearall which is handled below and # uses the delete_query API of History. if ( defined( $self->{form_}{clearpage} ) ) { # Remove the list of messages on the current page $self->{history__}->start_deleting(); for my $i ( keys %{$self->{form_}} ) { if ( $i =~ /^rowid_(\d+)$/ ) { $self->log_( 1, "clearpage $i" ); $self->{history__}->delete_slot( $1, 1 ); } } $self->{history__}->stop_deleting(); } if ( defined( $self->{form_}{clearchecked} ) ) { # Remove the list of marked messages using the array of # "remove" checkboxes $self->{history__}->start_deleting(); for my $i ( keys %{$self->{form_}} ) { if ( $i =~ /^remove_(\d+)$/ ) { my $slot = $1; if ( $self->{form_}{$i} ne '' ) { $self->log_( 1, "clearchecked $i" ); $self->{history__}->delete_slot( $slot ); } } } $self->{history__}->stop_deleting(); } # Handle clearing the history files, there are two options here, # clear the current page or clear all the files in the cache if ( defined( $self->{form_}{clearall} ) ) { $self->{history__}->delete_query( $self->{q__} ); } $self->{history__}->set_query( $self->{q__}, # PROFILE BLOCK START $self->{form_}{filter}, $self->{form_}{search}, $self->{form_}{sort}, ( $self->{form_}{negate} ne '' ) ); # PROFILE BLOCK STOP # Redirect somewhere safe if non-idempotent action has been taken if ( defined( $self->{form_}{clearpage} ) || # PROFILE BLOCK START defined( $self->{form_}{undo} ) || defined( $self->{form_}{reclassify} ) ) { # PROFILE BLOCK STOP return $self->http_redirect_( $client, "/history?" . $self->print_form_fields_(1,0,('start_message','filter','search','sort','session','negate') ) ); } my $session = $self->{api_session__}; my $page_size = $self->config_( 'page_size' ); my $query_size = $self->{history__}->get_query_size( $self->{q__} ); $templ->param( 'History_Field_Search' => $self->{form_}{search} ); $templ->param( 'History_Field_Not' => $self->{form_}{negate} ); $templ->param( 'History_If_Search' => defined( $self->{form_}{search} ) ); $templ->param( 'History_Field_Sort' => $self->{form_}{sort} ); $templ->param( 'History_Field_Filter' => $self->{form_}{filter} ); $templ->param( 'History_If_MultiPage' => $page_size <= $query_size ); $templ->param( 'History_Search_Filter_Highlight' => $self->config_( 'search_filter_highlight' ) ); my @buckets = $self->{c__}->get_buckets( $session ); my @bucket_data; foreach my $bucket (@buckets) { my %row_data; $row_data{History_Bucket} = $bucket; $row_data{History_Bucket_Color} = # PROFILE BLOCK START $self->{c__}->get_bucket_parameter( $session, $bucket, 'color' ); # PROFILE BLOCK STOP push ( @bucket_data, \%row_data ); } my @sf_bucket_data; foreach my $bucket (@buckets) { my %row_data; $row_data{History_Bucket} = $bucket; $row_data{History_Selected} = ( defined( $self->{form_}{filter} ) && ( $self->{form_}{filter} eq $bucket ) )?'selected':''; $row_data{History_Bucket_Color} = # PROFILE BLOCK START $self->{c__}->get_bucket_parameter( $session, $bucket, 'color' ); # PROFILE BLOCK STOP push ( @sf_bucket_data, \%row_data ); } $templ->param( 'History_Loop_SF_Buckets' => \@sf_bucket_data ); $templ->param( 'History_Filter_Magnet' => ($self->{form_}{filter} eq '__filter__magnet')?'selected':'' ); $templ->param( 'History_Filter_Unclassified' => ($self->{form_}{filter} eq 'unclassified')?'selected':'' ); $templ->param( 'History_Filter_Reclassified' => ($self->{form_}{filter} eq '__filter__reclassified')?'selected':'' ); $templ->param( 'History_Field_Not' => ($self->{form_}{negate} ne '')?'checked':'' ); if ( $query_size > 0 ) { $templ->param( 'History_If_Some_Messages' => 1 ); $templ->param( 'History_Count' => $self->pretty_number( $query_size ) ); my $start_message = 0; $start_message = $self->{form_}{start_message} if ( ( defined($self->{form_}{start_message}) ) && ($self->{form_}{start_message} > 0 ) ); if ( $start_message >= $query_size ) { $start_message -= $page_size; } if ( $start_message < 0 ) { $start_message = 0; } $self->{form_}{start_message} = $start_message; $templ->param( 'History_Start_Message' => $start_message ); my $stop_message = $start_message + $page_size - 1; $stop_message = $query_size - 1 if ( $stop_message >= $query_size ); $self->set_history_navigator__( $templ, $start_message, $stop_message ); # Work out which columns to show by splitting the columns # parameter at commas keeping all the items that start with a # +, and then strip the + my @columns = split( ',', $self->config_( 'columns' ) ); my @header_data; my $colspan = 1; my $length = 90; foreach my $header (@columns) { my %row_data; $header =~ /^(.)/; next if ( $1 eq '-' ); $header =~ s/^.//; $colspan++; $row_data{History_Fields} = # PROFILE BLOCK START $self->print_form_fields_(1,1, ('filter','session','search','negate')); # PROFILE BLOCK STOP $row_data{History_Sort} = # PROFILE BLOCK START ( $self->{form_}{sort} eq $header )?'-':''; # PROFILE BLOCK STOP $row_data{History_Header} = $header; my $label = ''; if ( defined $self->{language__}{ $headers_table{$header} }) { $label = $self->{language__}{ $headers_table{$header} }; } else { $label = $headers_table{$header}; } $row_data{History_Label} = $label; $row_data{History_If_Sorted} = # PROFILE BLOCK START ( $self->{form_}{sort} =~ /^\-?\Q$header\E$/ ); # PROFILE BLOCK STOP $row_data{History_If_Sorted_Ascending} = # PROFILE BLOCK START ( $self->{form_}{sort} !~ /^-/ ); # PROFILE BLOCK STOP push ( @header_data, \%row_data ); $length -= 10; } $templ->param( 'History_Loop_Headers' => \@header_data ); $templ->param( 'History_Colspan' => $colspan ); my @rows = $self->{history__}->get_query_rows( # PROFILE BLOCK START $self->{q__}, $start_message+1, $stop_message - $start_message + 1 ); # PROFILE BLOCK STOP my @history_data; my $i = $start_message; @columns = split( ',', $self->config_( 'columns' ) ); my $last = -1; if ( defined($self->{form_}{automatic}) ) { $self->config_( 'column_characters', 0 ); } if ( $self->config_( 'column_characters' ) != 0 ) { $length = $self->config_( 'column_characters' ); } if ( defined($self->{form_}{increase}) ) { $length++; $self->config_( 'column_characters', $length ); } if ( defined($self->{form_}{decrease}) ) { $length--; if ( $length < 5 ) { $length = 5; } $self->config_( 'column_characters', $length ); } foreach my $row (@rows) { my %row_data; my $mail_file = $row_data{History_Mail_File} = $$row[0]; foreach my $header (@columns) { $header =~ /(.)(.+)/; $row_data{"History_If_$2"} = ( $1 eq '+')?1:0; } if ( $self->config_( 'language' ) eq 'Nihongo' ) { # Remove wrong characters as euc-jp. for my $i (1..4) { my $result = ''; while ( $$row[$i] =~ /((?:$euc_jp){1,300})/og ) { $result .= $1; } $$row[$i] = $result; } } $row_data{History_Arrived} = $self->pretty_date__( $$row[7] ); $row_data{History_From} = $$row[1]; $row_data{History_To} = $$row[2]; $row_data{History_Cc} = $$row[3]; $row_data{History_Date} = $self->pretty_date__( $$row[5] ); $row_data{History_Subject} = $$row[4]; $row_data{History_Short_From} = $self->shorten__( $$row[1], $length ); $row_data{History_Short_To} = $self->shorten__( $$row[2], $length ); $row_data{History_Short_Cc} = $self->shorten__( $$row[3], $length ); $row_data{History_Short_Subject} = $self->shorten__( $$row[4], $length ); my $bucket = $row_data{History_Bucket} = $$row[8]; $row_data{History_Bucket_Color} = $self->{c__}->get_bucket_parameter( $self->{api_session__}, # PROFILE BLOCK START $bucket, 'color' ); # PROFILE BLOCK STOP $row_data{History_If_Reclassified} = ( $$row[9] != 0 ); $row_data{History_I} = $$row[0]; $row_data{History_I1} = $$row[0]; $row_data{History_Fields} = $self->print_form_fields_(0,1,('start_message','session','filter','search','sort','negate' ) ); $row_data{History_If_Not_Pseudo} = !$self->{c__}->is_pseudo_bucket( $self->{api_session__}, # PROFILE BLOCK START $bucket ); # PROFILE BLOCK STOP $row_data{History_If_Magnetized} = ($$row[11] ne ''); $row_data{History_MagnetUsed} = $self->{language__}{History_MagnetUsed} if $$row[11] ne ''; $row_data{History_Magnet} = $$row[11]; my $size = $$row[12]; if ( defined $size ) { if ( $size >= 1024 * 1024 ) { $row_data{History_Size} = sprintf $self->{language__}{History_Size_MegaBytes}, $size / ( 1024 * 1024 ); } elsif ( $size >= 1024 ) { $row_data{History_Size} = sprintf $self->{language__}{History_Size_KiloBytes}, $size / 1024; } else { $row_data{History_Size} = sprintf $self->{language__}{History_Size_Bytes}, $size; } } else { $row_data{History_Size} = "?"; } $row_data{History_Loop_Loop_Buckets} = \@bucket_data; if ( defined $self->{feedback}{$mail_file} ) { $row_data{History_If_Feedback} = 1; $row_data{History_Feedback} = $self->{feedback}{$mail_file}; delete $self->{feedback}{$mail_file}; } $row_data{Session_Key} = $self->{session_key__}; if ( ( $last != -1 ) && # PROFILE BLOCK START ( $self->{form_}{sort} =~ /inserted/ ) && ( $self->config_( 'session_dividers' ) ) ) { # PROFILE BLOCK STOP $row_data{History_If_Session} = # PROFILE BLOCK START ( abs( $$row[7] - $last ) > 300 ); # PROFILE BLOCK STOP } # we set this here so feedback lines will also # get the correct colspan: $row_data{History_Colspan} = $colspan+1; $last = $$row[7]; $row_data{Localize_History_Reclassified} = # PROFILE BLOCK START $self->{language__}{History_Reclassified}; # PROFILE BLOCK STOP $row_data{Localize_Undo} = $self->{language__}{Undo}; push ( @history_data, \%row_data ); } $templ->param( 'History_Loop_Messages' => \@history_data ); } $self->http_ok( $client, $templ, 0 ); } sub shorten__ { my ( $self, $string, $length ) = @_; if ( length($string) > $length ) { $string =~ /(.{$length})/; $1 =~ /((?:$euc_jp)*)/o if ( $self->config_( 'language' ) eq 'Nihongo' ); $string = "$1..."; } return $string; } #---------------------------------------------------------------------------- # # view_page - Shows a single email # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub view_page { my ( $self, $client, $templ ) = @_; if ( !$self->{history__}->is_valid_slot( $self->{form_}{view} ) ) { return $self->http_redirect_( $client, "/history?session=$self->{session_key__}" ); } my $mail_file = $self->{history__}->get_slot_file( $self->{form_}{view} ); my $start_message = $self->{form_}{start_message} || 0; my ( $id, $from, $to, $cc, $subject, $date, $hash, $inserted, # PROFILE BLOCK START $bucket, $reclassified, $bucketid, $magnet ) = $self->{history__}->get_slot_fields( $self->{form_}{view} ); # PROFILE BLOCK STOP my $session = $self->{api_session__}; my $color = $self->{c__}->get_bucket_color( # PROFILE BLOCK START $session, $bucket ); # PROFILE BLOCK STOP my $page_size = $self->config_( 'page_size' ); $self->{form_}{sort} = '' if ( !defined( $self->{form_}{sort} ) ); $self->{form_}{search} = '' if ( !defined( $self->{form_}{search} ) ); $self->{form_}{filter} = '' if ( !defined( $self->{form_}{filter} ) ); if ( !defined( $self->{form_}{format} ) ) { $self->{form_}{format} = $self->config_( 'wordtable_format' ); } # Provide message in plain text for user download/recovery purposes. if ( defined( $self->{form_}{text} ) ) { $self->http_file_( $client, $self->{history__}->get_slot_file( $self->{form_}{view} ), 'application/save-as' ); return 1; } # If a format change was requested for the word matrix, record it # in the configuration and in the classifier options. $self->{c__}->wmformat( $self->{form_}{format} ); my $index = $self->{form_}{view}; $templ->param( 'View_All_Fields' => $self->print_form_fields_(1,1,('start_message','filter','session','search','sort','negate'))); $templ->param( 'View_Field_Search' => $self->{form_}{search} ); $templ->param( 'View_Field_Negate' => $self->{form_}{negate} ); $templ->param( 'View_Field_Sort' => $self->{form_}{sort} ); $templ->param( 'View_Field_Filter' => $self->{form_}{filter} ); $templ->param( 'View_From' => $from ); $templ->param( 'View_To' => $to ); $templ->param( 'View_Cc' => $cc ); $templ->param( 'View_Date' => $self->pretty_date__( $date, 1 ) ); $templ->param( 'View_Subject' => $subject ); $templ->param( 'View_Bucket' => $bucket ); $templ->param( 'View_Bucket_Color' => $color ); $templ->param( 'View_Index' => $index ); $templ->param( 'View_This' => $index ); $templ->param( 'View_This_Page' => (( $index ) >= $start_message )?$start_message:($start_message - $page_size)); # TODO $templ->param( 'View_If_Reclassified' => $reclassified ); if ( $reclassified ) { $templ->param( 'View_Already' => sprintf( $self->{language__}{History_Already}, ($color || ''), ($bucket || '') ) ); } else { $templ->param( 'View_If_Magnetized' => ( $magnet ne '' ) ); if ( $magnet eq '' ) { my @bucket_data; foreach my $abucket ($self->{c__}->get_buckets( $session )) { my %row_data; $row_data{View_Bucket_Color} = $self->{c__}->get_bucket_color( $session, $abucket ); $row_data{View_Bucket} = $abucket; push ( @bucket_data, \%row_data ); } $templ->param( 'View_Loop_Buckets' => \@bucket_data ); } else { $templ->param( 'View_Magnet' => $magnet ); } } if ( $magnet eq '' ) { my %matrix; my %idmap; # Enable saving of word-scores $self->{c__}->wordscores( 1 ); # Build the scores by classifying the message, since # get_html_colored_message has parsed the message for us we do # not need to parse it again and hence we pass in undef for # the filename my $current_class = 'unclassified'; if ( -f $mail_file ) { $current_class = $self->{c__}->classify( # PROFILE BLOCK START $session, $mail_file, $templ, \%matrix, \%idmap ); # PROFILE BLOCK STOP } else { $self->log_( 0, "Message file '$mail_file' is not found." ); } # Check whether the original classfication is still valid. If # not, add a note at the top of the page: if ( $current_class ne $bucket ) { my $new_color = $self->{c__}->get_bucket_color( # PROFILE BLOCK START $session, $current_class ); # PROFILE BLOCK STOP $templ->param( 'View_If_Class_Changed' => 1 ); $templ->param( 'View_Class_Changed' => $current_class ); $templ->param( 'View_Class_Changed_Color' => $new_color ); } # Disable, print, and clear saved word-scores $self->{c__}->wordscores( 0 ); if ( -f $mail_file ) { $templ->param( 'View_Message' => # PROFILE BLOCK START $self->{c__}->fast_get_html_colored_message( $session, $mail_file, \%matrix, \%idmap ) ); # PROFILE BLOCK STOP } # We want to insert a link to change the output format at the # start of the word matrix. The classifier puts a comment in # the right place, which we can replace by the link. (There's # probably a better way.) my $view = $self->{language__}{View_WordProbabilities}; if ( $self->{form_}{format} eq 'freq' ) { $view = $self->{language__}{View_WordFrequencies}; } if ( $self->{form_}{format} eq 'score' ) { $view = $self->{language__}{View_WordScores}; } if ( $self->{form_}{format} ne '' ) { $templ->param( 'View_If_Format' => 1 ); $templ->param( 'View_View' => $view ); } if ($self->{form_}{format} ne 'freq' ) { $templ->param( 'View_If_Format_Freq' => 1 ); } if ($self->{form_}{format} ne 'prob' ) { $templ->param( 'View_If_Format_Prob' => 1 ); } if ($self->{form_}{format} ne 'score' ) { $templ->param( 'View_If_Format_Score' => 1 ); } } else { # TODO: See comment below for details # $magnet =~ /(.+): ([^\r\n]+)/; # my $header = $1; # my $text = $2; my $body = ''; open MESSAGE, '<' . $mail_file; my $line; while ($line = ) { $line =~ s//>/g; $line =~ s/([^\r\n]{100,150} )/$1
/g; $line =~ s/([^ \r\n]{150})/$1
/g; $line =~ s/[\r\n]+/
/g; # TODO: This code is now useless because the magnet itself # doesn't contain the information about which header we are # looking for. Ultimately, we need to fix this but I decided # for v0.22.0 release to not make further changes and leave this # code as unfixed. # if ( $line =~ /^([A-Za-z-]+): ?([^\n\r]*)/ ) { # my $head = $1; # my $arg = $2; # if ( $head =~ /\Q$header\E/i ) { # $text =~ s//>/g; # if ( $arg =~ /\Q$text\E/i ) { # my $new_color = $self->{c__}->get_bucket_color( $self->{api_session__}, $bucket ); # $line =~ s/(\Q$text\E)/$1<\/font><\/b>/; # } # } # } $body .= $line; } close MESSAGE; $body .= '
'; $templ->param( 'View_Message' => $body ); } if ( $magnet ne '' ) { $templ->param( 'View_Magnet_Reason' => sprintf( $self->{language__}{History_MagnetBecause}, # PROFILE BLOCK START $color, $bucket, Classifier::MailParse->splitline( $magnet, 0 ) ) ); # PROFILE BLOCK STOP } $self->http_ok( $client, $templ, 0 ); } #---------------------------------------------------------------------------- # # password_page - Simple page asking for the POPFile password # # $client The web browser to send the results to # $error 1 if the user previously typed the password incorrectly # $redirect The page to go to on a correct password # #---------------------------------------------------------------------------- sub password_page { my ( $self, $client, $error, $redirect ) = @_; my $session_temp = $self->{session_key__}; # Show a page asking for the password with no session key # information on it $self->{session_key__} = ''; my $templ = $self->load_template__( 'password-page.thtml' ); $self->{session_key__} = $session_temp; # These things need fixing up on the password page: # # The page to redirect to if the user gets the password right # An error if they typed in the wrong password $templ->param( 'Password_If_Error' => $error ); $templ->param( 'Password_Redirect' => $redirect ); $self->http_ok( $client, $templ ); } #---------------------------------------------------------------------------- # # session_page - Simple page information the user of a bad session key # # $client The web browser to send the results to # #---------------------------------------------------------------------------- sub session_page { my ( $self, $client ) = @_; my $templ = $self->load_template__( 'session-page.thtml' ); $self->http_ok( $client, $templ ); } #---------------------------------------------------------------------------- # # load_template__ # # Loads the named template and returns a new HTML::Template object # # $template The name of the template to load from the current skin # #---------------------------------------------------------------------------- sub load_template__ { my ( $self, $template ) = @_; # First see if that template exists in the currently selected # skin, if it does not then load the template from the default. # This allows a skin author to change just a single part of # POPFile with duplicating that entire set of templates my $root = 'skins/' . $self->config_( 'skin' ) . '/'; my $template_root = $root; my $file = $self->get_root_path_( "$template_root$template" ); if ( !( -e $file ) ) { $template_root = 'skins/default/'; $file = $self->get_root_path_( "$template_root$template" ); } my $css = $self->get_root_path_( $root . 'style.css' ); if ( !( -e $css ) ) { $root = 'skins/default/'; } my $templ = HTML::Template->new( # PROFILE BLOCK START filename => $file, case_sensitive => 1, loop_context_vars => 1, cache => $self->config_( 'cache_templates' ), die_on_bad_params => $self->config_( 'strict_templates' ), search_path_on_include => 1, path => [$self->get_root_path_( "$root" ), $self->get_root_path_( 'skins/default' ) ] ); # PROFILE BLOCK STOP # Set a variety of common elements that are used repeatedly # throughout POPFile's pages my $now = time; my %fixups = ( 'Skin_Root' => $root, # PROFILE BLOCK START 'Session_Key' => $self->{session_key__}, 'Common_Bottom_Date' => $self->pretty_date__( $now ), 'Common_Bottom_LastLogin' => $self->{last_login__}, 'Common_Bottom_Version' => $self->version(), 'If_Show_Bucket_Help' => $self->config_( 'show_bucket_help' ), 'If_Show_Training_Help' => $self->config_( 'show_training_help' ) ); # PROFILE BLOCK STOP foreach my $fixup (keys %fixups) { if ( $templ->query( name => $fixup ) ) { $templ->param( $fixup => $fixups{$fixup} ); } } $self->localize_template__( $templ ); return $templ; } #---------------------------------------------------------------------------- # # localize_template__ # # Localize a template by converting all the Localize_X variables to the # appropriate variable X from the language__ hash. # #---------------------------------------------------------------------------- sub localize_template__ { my ( $self, $templ ) = @_; # Localize the template in use. # # Templates are automatically localized. Any TMPL_VAR that begins # with Localize_ will be fixed up automatically with the # appropriate string for the language in use. For example if you # write # # # # this will automatically be converted to the string associated # with Foo_Bar in the current language file. my @vars = $templ->param(); foreach my $var (@vars) { if ( $var =~ /^Localize_(.*)/ ) { $templ->param( $var => $self->{language__}{$1} ); } } } #---------------------------------------------------------------------------- # # load_skins__ # # Gets the names of all the directory in the skins subdirectory and # loads them into the skins array. # #---------------------------------------------------------------------------- sub load_skins__ { my ( $self ) = @_; @{$self->{skins__}} = glob $self->get_root_path_( 'skins/*' ); for my $i (0..$#{$self->{skins__}}) { $self->{skins__}[$i] =~ s/\/$//; $self->{skins__}[$i] .= '/'; } } #---------------------------------------------------------------------------- # # load_languages__ # # Get the names of the available languages for the user interface # #---------------------------------------------------------------------------- sub load_languages__ { my ( $self ) = @_; @{$self->{languages__}} = glob $self->get_root_path_( 'languages/*.msg' ); for my $i (0..$#{$self->{languages__}}) { $self->{languages__}[$i] =~ s/.*\/(.+)\.msg$/$1/; } } #---------------------------------------------------------------------------- # # change_session_key__ # # Changes the session key, the session key is a randomly chosen 6 to # 10 character key that protects and identifies sessions with the # POPFile user interface. At the current time it is primarily used # for two purposes: to prevent a malicious user telling the browser to # hit a specific URL causing POPFile to do something undesirable (like # shutdown) and to handle the password mechanism: if the session key # is wrong the password challenge is made. # # The characters valid in the session key are A-Z, a-z and 0-9 # #---------------------------------------------------------------------------- sub change_session_key__ { my ( $self ) = @_; my @chars = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', # PROFILE BLOCK START 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A' ); # PROFILE BLOCK STOP $self->{session_key__} = ''; my $length = int( 6 + rand(4) ); for my $i (0 .. $length) { my $random = $chars[int( rand(36) )]; # Just to add spice to things we sometimes lowercase the value if ( rand(1) < rand(1) ) { $random = lc($random); } $self->{session_key__} .= $random; } } #---------------------------------------------------------------------------- # # load_language # # Fill the language hash with the language strings that are from the # named language file # # $lang - The language to load (no .msg extension) # #---------------------------------------------------------------------------- sub load_language { my ( $self, $lang ) = @_; if ( open LANG, '<' . $self->get_root_path_( "languages/$lang.msg" ) ) { while ( ) { next if ( /[ \t]*#/ ); if ( /([^\t ]+)[ \t]+(.+)/ ) { my ( $id, $value ) = ( $1, $2 ); if ( $value =~ /^\"(.+)\"$/ ) { $value = $1; } my $msg = ($self->config_( 'test_language' )) ? $id : $value; $msg =~ s/[\r\n]//g; $self->{language__}{$id} = $msg; } } close LANG; } } #---------------------------------------------------------------------------- # # calculate_today - set the global $self->{today__} variable to the # current day in seconds # #---------------------------------------------------------------------------- sub calculate_today { my ( $self ) = @_; $self->{today__} = int( time / $seconds_per_day ) * $seconds_per_day; # A slash / for eclipse } #---------------------------------------------------------------------------- # # print_form_fields_ - Returns a form string containing any presently # defined form fields # # $first - 1 if the form field is at the beginning of a query, 0 # otherwise # $in_href - 1 if the form field is printing in a href, 0 # otherwise (eg, for a 302 redirect) # $include - a list of fields to # return # #---------------------------------------------------------------------------- sub print_form_fields_ { my ($self, $first, $in_href, @include) = @_; my $amp; if ($in_href) { $amp = '&'; } else { $amp = '&'; } my $count = 0; my $formstring = ''; $formstring = "$amp" if (!$first); foreach my $field ( @include ) { if ($field eq 'session') { $formstring .= "$amp" if ($count > 0); $formstring .= "session=$self->{session_key__}"; $count++; next; } unless ( !defined($self->{form_}{$field}) || ( $self->{form_}{$field} eq '' ) ) { $formstring .= "$amp" if ($count > 0); $formstring .= "$field=". $self->url_encode_($self->{form_}{$field}); $count++; } } return ($count>0)?$formstring:''; } #---------------------------------------------------------------------------- # register_configuration_item__ # # $type The type of item (configuration, security or chain) # $name Unique name for this item # $template The name of the template to load # $object Reference to the object calling this method # # This seemingly innocent method disguises a lot. It is called by # modules that wish to register that they have specific elements of UI # that need to be dynamically added to the Configuration and Security # screens of POPFile. This is done so that the HTML module does not # need to know about the modules that are loaded, their individual # configuration elements or how to do validation # # A module calls this method for each separate UI element (normally an # HTML form that handles a single configuration option stored in a # template) and passes in four pieces of information: # # The type is the position in the UI where the element is to be # displayed. configuration means on the Configuration screen under # "Module Options"; security means on the Security page and is used # exclusively for stealth mode operation right now; chain is also on # the security page and is used for identifying chain servers (in the # case of SMTP the chained server and for POP3 the SPA server) # # A unique name for this configuration item # # The template (this is the name of a template file and must be unique # for each call to this method) # # A reference to itself. # # When this module needs to display an element of UI it will call the # object's configure_item public method passing in the name of the # element required, a reference to the loaded template and # configure_item must set whatever variables are required in the # template. # # When the module needs to validate it will call the object's # validate_item interface passing in the name of the element, a # reference to the template and a reference to the form hash which has # been parsed. # # Example the module foo has a configuration item called bar which it # needs a UI for, and so it calls # # register_configuration_item( 'configuration', 'foo', 'foo-bar.thtml', # $self ) # # later it will receive a call to its # # configure_item( 'foo', loaded foo-bar.thtml, language hash ) # # and needs to fill the template variables. Then it will receive a # call to its # # validate_item( 'foo', loaded foo-bar.thtml, language hash, form hash ) # # and needs to check the form for information from any form it created # and returned from the call to configure_item and update its own # state. # #---------------------------------------------------------------------------- sub register_configuration_item__ { my ( $self, $type, $name, $templ, $object ) = @_; $self->{dynamic_ui__}{$type}{$name}{object} = $object; $self->{dynamic_ui__}{$type}{$name}{template} = $templ; } #---------------------------------------------------------------------------- # # mcount__, ecount__ get the total message count, or the total error count # #---------------------------------------------------------------------------- sub mcount__ { my ( $self ) = @_; my $count = 0; my @buckets = $self->{c__}->get_all_buckets( $self->{api_session__} ); foreach my $bucket (@buckets) { $count += $self->get_bucket_parameter__( $bucket, 'count' ); } return $count; } sub ecount__ { my ( $self ) = @_; my $count = 0; my @buckets = $self->{c__}->get_all_buckets( $self->{api_session__} ); foreach my $bucket (@buckets) { $count += $self->get_bucket_parameter__( $bucket, 'fncount' ); } return $count; } #---------------------------------------------------------------------------- # # get_bucket_parameter__/set_bucket_parameter__ # # Wrapper for Classifier::Bayes::get_bucket_parameter__ the eliminates # the need for all our calls to mention $self->{api_session__} # # See Classifier::Bayes::get_bucket_parameter for parameters and # return values. # # (same thing for set_bucket_parameter__) # #---------------------------------------------------------------------------- sub get_bucket_parameter__ { # The first parameter is going to be a reference to this class, the # rest we leave untouched in @_ and pass to the real API my $self = shift; return $self->{c__}->get_bucket_parameter( $self->{api_session__}, @_ ); } sub set_bucket_parameter__ { my $self = shift; return $self->{c__}->set_bucket_parameter( $self->{api_session__}, @_ ); } # GETTERS/SETTERS sub classifier { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{c__} = $value; } return $self->{c__}; } sub language { my ( $self ) = @_; return %{$self->{language__}}; } sub session_key { my ( $self ) = @_; return $self->{session_key__}; } #---------------------------------------------------------------------------- # # shutdown_page__ # # Determines the text to send in response to a click on the shutdown # link. # #---------------------------------------------------------------------------- sub shutdown_page__ { my ( $self ) = @_; # Figure out what style sheet we are using my $root = 'skins/' . $self->config_( 'skin' ) . '/'; my $css_file = $self->get_root_path_( $root . 'style.css' ); if ( !( -e $css_file ) ) { $root = 'skins/default/'; $css_file = $self->get_root_path_( $root . 'style.css' ); } # Now load the style sheet my $css = '"; # Load the template, set the class of the menu tabs, and send the # output to $text my $templ = $self->load_template__( 'shutdown-page.thtml' ); for my $i ( 0..5 ) { $templ->param( "Common_Middle_Tab$i" => "menuStandard" ); } my $text = $templ->output(); # Replace the reference to the favicon, we won't be able to handle # that request $text =~ s///; # Replace the link to the style sheets with the style sheet itself $text =~ s/\Q\E/$css/; # Remove the session key from the menu links: $text =~ s/href="(.+?)\?session=.+?"/href="$1"/g; return $text; } 1; popfile-1.1.3+dfsg/UI/HTTP.pm0000664000175000017500000003470011710356074015007 0ustar danieldaniel#---------------------------------------------------------------------------- # # This package contains an HTTP server used as a base class for other # modules that service requests over HTTP (e.g. the UI) # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- package UI::HTTP; use POPFile::Module; @ISA = ("POPFile::Module"); use strict; use warnings; use locale; use IO::Socket::INET qw(:DEFAULT :crlf); use IO::Select; use Date::Format qw(time2str); # A handy variable containing the value of an EOL for the network my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); bless $self; return $self; } # --------------------------------------------------------------------------- # # start # # Called to start the HTTP interface running # # --------------------------------------------------------------------------- sub start { my ( $self ) = @_; $self->log_( 1, "Trying to open listening socket on port " . $self->config_('port') . '.' ); $self->{server_} = IO::Socket::INET->new( Proto => 'tcp', # PROFILE BLOCK START $self->config_( 'local' ) == 1 ? (LocalAddr => 'localhost') : (), LocalPort => $self->config_( 'port' ), Listen => SOMAXCONN, Reuse => 1 ); # PROFILE BLOCK STOP if ( !defined( $self->{server_} ) ) { my $port = $self->config_( 'port' ); my $name = $self->name(); $self->log_( 0, "Couldn't start the $name interface because POPFile could not bind to the listen port $port" ); print STDERR <{selector_} = new IO::Select( $self->{server_} ); return 1; } # ---------------------------------------------------------------------------- # # stop # # Called when the interface must shutdown # # ---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; close $self->{server_} if ( defined( $self->{server_} ) ); } # ---------------------------------------------------------------------------- # # service # # Called to handle interface requests # # ---------------------------------------------------------------------------- sub service { my ( $self ) = @_; my $code = 1; return $code if ( !defined( $self->{selector_} ) ); # See if there's a connection waiting for us, if there is we # accept it handle a single request and then exit my ( $ready ) = $self->{selector_}->can_read(0); # Handle HTTP requests for the UI if ( ( defined( $ready ) ) && ( $ready == $self->{server_} ) ) { if ( my $client = $self->{server_}->accept() ) { # Check that this is a connection from the local machine, # if it's not then we drop it immediately without any # further processing. We don't want to allow remote users # to admin POPFile my ( $remote_port, $remote_host ) = sockaddr_in( $client->peername() ); if ( ( $self->config_( 'local' ) == 0 ) || # PROFILE BLOCK START ( $remote_host eq inet_aton( "127.0.0.1" ) ) ) { # PROFILE BLOCK STOP # Read the request line (GET or POST) from the client # and if we manage to do that then read the rest of # the HTTP headers grabbing the Content-Length and # using it to read any form POST content into $content $client->autoflush(1); if ( ( defined( $client ) ) && # PROFILE BLOCK START ( my $request = $self->slurp_( $client ) ) ) { # PROFILE BLOCK STOP my $content_length = 0; my $content = ''; my $status_code = 200; $self->log_( 2, $request ); while ( my $line = $self->slurp_( $client ) ) { $content_length = $1 if ( $line =~ /Content-Length: (\d+)/i ); # Discovered that Norton Internet Security was # adding HTTP headers of the form # # ~~~~~~~~~~~~~~: ~~~~~~~~~~~~~ # # which we were not recognizing as valid # (surprise, surprise) and this was messing # about our handling of POST data. Changed # the end of header identification to any line # that does not contain a : last if ( $line !~ /:/ ); } if ( $content_length > 0 ) { $content = $self->slurp_buffer_( $client, # PROFILE BLOCK START $content_length ); # PROFILE BLOCK STOP if ( !defined( $content ) ) { $status_code = 400; } else { $self->log_( 2, $content ); } } if ( $status_code != 200 ) { $self->http_error_( $client, $status_code ); } else { if ( $request =~ /^(GET|POST) (.*) HTTP\/1\./i ) { $code = $self->handle_url( $client, $2, $1, $content ); $self->log_( 2, # PROFILE BLOCK START "HTTP handle_url returned code $code\n" ); # PROFILE BLOCK STOP } else { $self->http_error_( $client, 500 ); } } } } $self->log_( 2, "Close HTTP connection on $client\n" ); $self->done_slurp_( $client ); close $client; } } return $code; } # ---------------------------------------------------------------------------- # # forked # # Called when someone forks POPFile # # ---------------------------------------------------------------------------- sub forked { my ( $self ) = @_; close $self->{server_}; } # ---------------------------------------------------------------------------- # # handle_url - Handle a URL request # # $client The web browser to send the results to # $url URL to process # $command The HTTP command used (GET or POST) # $content Any non-header data in the HTTP command # # ---------------------------------------------------------------------------- sub handle_url { my ( $self, $client, $url, $command, $content ) = @_; return $self->{url_handler_}( $self, $client, $url, $command, $content ); } # ---------------------------------------------------------------------------- # # parse_form_ - parse form data and fill in $self->{form_} # # $arguments The text of the form arguments (e.g. foo=bar&baz=fou) or separated by # CR/LF # # ---------------------------------------------------------------------------- sub parse_form_ { my ( $self, $arguments ) = @_; # Normally the browser should have done & to & translation on # URIs being passed onto us, but there was a report that someone # was having a problem with form arguments coming through with # something like http://127.0.0.1/history?session=foo&filter=bar # which would mess things up in the argument splitter so this code # just changes & to & for safety return if ( !defined $arguments ); $arguments =~ s/&/&/g; while ( $arguments =~ m/\G(.*?)=(.*?)(&|\r|\n|$)/g ) { my $arg = $1; my $need_array = defined( $self->{form_}{$arg} ); if ( $need_array ) { if ( $#{ $self->{form_}{$arg . "_array"} } == -1 ) { push( @{ $self->{form_}{$arg . "_array"} }, $self->{form_}{$arg} ); } } $self->{form_}{$arg} = $2; $self->{form_}{$arg} =~ s/\+/ /g; # Expand hex escapes in the form data $self->{form_}{$arg} =~ s/%([0-9A-F][0-9A-F])/chr hex $1/gie; # Push the value onto an array to allow for multiple values of # the same name if ( $need_array ) { push( @{ $self->{form_}{$arg . "_array"} }, $self->{form_}{$arg} ); } } } # ---------------------------------------------------------------------------- # # url_encode_ # # $text Text to encode for URL safety # # Encode a URL so that it can be safely passed in a URL as per RFC2396 # # ---------------------------------------------------------------------------- sub url_encode_ { my ( $self, $text ) = @_; $text =~ s/ /\+/; $text =~ s/([^a-zA-Z0-9_\-.\+\'!~*\(\)])/sprintf("%%%02x",ord($1))/eg; return $text; } # ---------------------------------------------------------------------------- # # http_redirect_ - tell the browser to redirect to a url # # $client The web browser to send redirect to # $url Where to go # # Return a valid HTTP/1.0 header containing a 302 redirect message to the passed in URL # # ---------------------------------------------------------------------------- sub http_redirect_ { my ( $self, $client, $url ) = @_; my $header = "HTTP/1.0 302 Found$eol" . "Location: $url$eol" . "$eol"; print $client $header; } # ---------------------------------------------------------------------------- # # http_error_ - Output a standard HTTP error message # # $client The web browser to send the results to # $error The error number # # Return a simple HTTP error message in HTTP 1/0 format # # ---------------------------------------------------------------------------- sub http_error_ { my ( $self, $client, $error ) = @_; $self->log_( 0, "HTTP error $error returned" ); my $text = # PROFILE BLOCK START "POPFile Web Server Error $error

POPFile Web Server Error $error

An error has occurred which has caused POPFile to return the error $error.

Click here to continue. $eol"; # PROFILE BLOCK STOP $self->log_( 1, $text ); my $error_code = 500; $error_code = $error if ( $error =~ /^\d{3}$/ ); print $client "HTTP/1.0 $error_code Error$eol"; print $client "Content-Type: text/html$eol"; print $client "Content-Length: "; print $client length( $text ); print $client "$eol$eol"; print $client $text; } # ---------------------------------------------------------------------------- # # http_file_ - Read a file from disk and send it to the other end # # $client The web browser to send the results to # $file The file to read (always assumed to be a GIF right now) # $type Set this to the HTTP return type (e.g. text/html or image/gif) # # Returns the contents of a file formatted into an HTTP 200 message or # an HTTP 404 if the file does not exist # # ---------------------------------------------------------------------------- sub http_file_ { my ( $self, $client, $file, $type ) = @_; my $contents = ''; if ( defined( $file ) && ( open FILE, "<$file" ) ) { binmode FILE; while () { $contents .= $_; } close FILE; # To prevent the browser for continuously asking for file # handled in this way we calculate the current date and time # plus 1 hour to give the browser cache 1 hour to keep things # like graphics and style sheets in cache. my $header = $self->build_http_header_( 200, $type, time + 60 * 60, length( $contents ) ); print $client $header . $contents; } else { $self->http_error_( $client, 404 ); } } # ---------------------------------------------------------------------------- # # build_http_header_ - # # $status The status code # $type The type of the content # $expires The datetime the page cache expires # If 0, the page cache will expire instantly # $length The length of the content # # Returns the header # # ---------------------------------------------------------------------------- sub build_http_header_ { my ( $self, $status, $type, $expires, $length ) = @_; my $date = time2str( "%a, %d %h %Y %X %Z", time, 'GMT' ); if ( $expires != 0 ) { $expires = time2str( "%a, %d %h %Y %X %Z", $expires, 'GMT' ); } my $header = "HTTP/1.0 $status OK$eol" . # PROFILE BLOCK START "Connection: close$eol" . "Content-Type: $type$eol" . "Date: $date$eol" . "Expires: $expires$eol" . ( $expires eq '0' ? "Pragma: no-cache$eol" . "Cache-Control: no-cache$eol" : '' ) . "Content-Length: $length$eol" . "$eol"; # PROFILE BLOCK STOP return $header; } # GETTERS/SETTERS sub history { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{history__} = $value; } return $self->{history__}; } popfile-1.1.3+dfsg/UI/XMLRPC.pm0000664000175000017500000002445111710356074015237 0ustar danieldaniel# POPFILE LOADABLE MODULE package UI::XMLRPC; #---------------------------------------------------------------------------- # # This package contains the XML-RPC interface for POPFile, all the methods # in Classifier::Bayes can be accessed through the XMLRPC interface and # a typical method would be accessed as follows # # Classifier/Bayes.get_buckets # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # #---------------------------------------------------------------------------- use POPFile::Module; @ISA = ("POPFile::Module"); use POPFile::API; use strict; use warnings; use locale; use IO::Socket; use IO::Select; my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); bless $self, $type;; $self->name( 'xmlrpc' ); return $self; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the interface # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # By default we are disabled $self->config_( 'enabled', 0 ); # XML-RPC is available on port 8081 initially $self->config_( 'port', 8081 ); # Only accept connections from the local machine $self->config_( 'local', 1 ); $self->{api__} = new POPFile::API; return 1; } # ---------------------------------------------------------------------------- # # start # # Called to start the XMLRPC interface running # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; if ( $self->config_( 'enabled' ) == 0 ) { return 2; } require XMLRPC::Transport::HTTP; # Tell the user interface module that we having a configuration # item that needs a UI component $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START 'xmlrpc_port', 'xmlrpc-port.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'security', # PROFILE BLOCK START 'xmlrpc_local', 'xmlrpc-local.thtml', $self ); # PROFILE BLOCK STOP # We use a single XMLRPC::Lite object to handle requests for access to the # Classifier::Bayes object $self->{server__} = XMLRPC::Transport::HTTP::Daemon->new( # PROFILE BLOCK START Proto => 'tcp', $self->config_( 'local' ) == 1 ? (LocalAddr => 'localhost') : (), LocalPort => $self->config_( 'port' ), Listen => SOMAXCONN, Reuse => 1 ); # PROFILE BLOCK STOP if ( !defined( $self->{server__} ) ) { my $port = $self->config_( 'port' ); my $name = $self->name(); $self->log_( 0, "Couldn't start the $name interface because POPFile could not bind to the listen port $port" ); print <{api__}->{c} = $self->{classifier__}; $self->{server__}->dispatch_to( $self->{api__} ); # DANGER WILL ROBINSON! In order to make a polling XML-RPC server I am using # the XMLRPC::Transport::HTTP::Daemon class which uses blocking I/O. This would # be all very well but it seems to be totally ignorning signals on Windows and so # POPFile is unstoppable when the handle() method is called. Forking with this # blocking doesn't help much because then we get an unstoppable child. # # So the solution relies on knowing the internals of XMLRPC::Transport::HTTP::Daemon # which is actually a SOAP::Transport::HTTP::Daemon which has a HTTP::Daemon (stored # in a private variable called _daemon. HTTP::Daemon is an IO::Socket::INET which means # we can create a selector on it, so here we access a PRIVATE variable on the XMLRPC # object. This is very bad behaviour, but it works until someone changes XMLRPC. $self->{selector__} = new IO::Select( $self->{server__}->{_daemon} ); return 1; } # ---------------------------------------------------------------------------- # # service # # Called to handle interface requests # # ---------------------------------------------------------------------------- sub service { my ( $self ) = @_; # See if there's a connection pending on the XMLRPC socket and handle # single request my ( $ready ) = $self->{selector__}->can_read(0); if ( defined( $ready ) ) { if ( my $client = $self->{server__}->accept() ) { # Check that this is a connection from the local machine, if it's not then we drop it immediately # without any further processing. We don't want to allow remote users to admin POPFile my ( $remote_port, $remote_host ) = sockaddr_in( $client->peername() ); if ( ( $self->config_( 'local' ) == 0 ) || # PROFILE BLOCK START ( $remote_host eq inet_aton( "127.0.0.1" ) ) ) { # PROFILE BLOCK STOP my $request = $client->get_request(); # Note that handle() relies on the $request being perfectly valid, so here we # check that it is, if it is not then we don't want to call handle and we'll # return out own error if ( defined( $request ) ) { $self->{server__}->request( $request ); # Note the direct call to SOAP::Transport::HTTP::Server::handle() here, this is # because we have taken the code from XMLRPC::Transport::HTTP::Server::handle() # and reproduced a modification of it here, accepting a single request and handling # it. This call to the parent of XMLRPC::Transport::HTTP::Server will actually # deal with the request $self->{server__}->SOAP::Transport::HTTP::Server::handle(); $client->send_response( $self->{server__}->response ); } $client->close(); } } } return 1; } # ---------------------------------------------------------------------------- # # configure_item # # $name Name of this item # $templ The loaded template that was passed as a parameter # when registering # $language Current language # # ---------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $templ, $language ) = @_; if ( $name eq 'xmlrpc_port' ) { $templ->param ( 'XMLRPC_Port' => $self->config_( 'port' ) ); } if ( $name eq 'xmlrpc_local' ) { if ( $self->config_( 'local' ) == 1 ) { $templ->param( 'XMLRPC_local_on' => 1 ); } else { $templ->param( 'XMLRPC_local_on' => 0 ); } } } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $templ The loaded template # $language The language currently in use # $form Hash containing all form items # # ---------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $templ, $language, $form ) = @_; # Just check to see if the XML rpc port was change and check its value if ( $name eq 'xmlrpc_port' ) { if ( defined($$form{xmlrpc_port}) ) { if ( ( $$form{xmlrpc_port} >= 1 ) && ( $$form{xmlrpc_port} < 65536 ) ) { $self->config_( 'port', $$form{xmlrpc_port} ); $templ->param( 'XMLRPC_port_if_error' => 0 ); $templ->param( 'XMLRPC_port_updated' => sprintf( $$language{Configuration_XMLRPCUpdate}, $self->config_( 'port' ) ) ); } else { $templ->param( 'XMLRPC_port_if_error' => 1 ); } } } if ( $name eq 'xmlrpc_local' ) { $self->config_( 'local', $$form{xmlrpc_local}-1 ) if ( defined($$form{xmlrpc_local}) ); } return ''; } # GETTERS/SETTERS sub classifier { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{classifier__} = $value; } return $self->{classifier__}; } sub history { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{history__} = $value; } return $self->{history__}; } 1; popfile-1.1.3+dfsg/stopwords0000664000175000017500000000212211624177332015337 0ustar danieldanielgone smtp status plaintext applet edu oct it's embed helvetica param map cdt tue height you strike our del going received esmtp ltd width not person nov thead head marquee she message pdt com fri are return yet his from blink samp kbd mail note sub has frame spot jul may alt cite center nbsp subject dir address the basefont doing caption being frameset xmp form mailto date went www big sup jun path listing align org will link serif var cellspacing could isindex goes input and inc script pre that meta anotherbigword title nobr sat select span dfn encoding mon blockquote gmt strong est jan for cgi did apr been have base math had bgcolor fig any author having feb dec html sep this valign off with thu net range would can color but font was menu abbrev table sun tbody ask https wed tfoot localhost charset lang body wbr textarea http col spacer iframe img acronym src helo him colgroup div done advanced out pst aug your small tab yes noframes its mar ins multicol etc also code does area banner her were all edt cst textflow overlay bgsound sans border mbox htm header:From header:To header:Subject popfile-1.1.3+dfsg/skins/0000775000175000017500000000000011710356074014500 5ustar danieldanielpopfile-1.1.3+dfsg/skins/windows/0000775000175000017500000000000011710356074016172 5ustar danieldanielpopfile-1.1.3+dfsg/skins/windows/style.css0000664000175000017500000001567611624177324020066 0ustar danieldaniel/* Windows skin emulates the look and feel of the Windows GUI without loading any graphics. Almost all the colors are system colors so the skin fits right in with your color scheme. It looks best by far in Mozilla 1.3+ on any OS. IE 6 is ok but doesn't show the full effect, IE 5 is ugly but usable. Opera 7.10 and KDE Konqueror 3.04 are pretty good. Konqueror 2, and Mac OS9 IE 5 are not bad. Its does well on OS X's Safari 1.0 beta, Opera, and IE 5. It seems on most Mac browsers the "title bar" is not working correctly due to the way they handle system colors. Original design by Joseph Connors (TexasFett), but wouldn't look nearly as good without Dan Martin (Kraelen). Thanks Dan. CSS2 sytle comments are below the line they apply to. CSS1 style comments are hacks to make the skin look better on IE and Konqueror since they ignore CSS1 commenting. But that means its not fully valid CSS2. */ body { background-color: Background; font: caption; /* set the system fonts for everything. */ margin: 1%; margin-bottom: 1em; } .shell { border-style: outset; border-color: ActiveBorder; border-width: 2px; background-color: ThreeDFace; width: 100%; padding: 0; } .shellTop { width: 100%; padding: 0; margin: 0; border: 0; border-collapse: collapse; } .shellLeft, .shellRight { display: none; } .shellTopRow, .shellTopLeft, .shellTopCenter, .shellTopRight { display: none; } .shellBottomRow, .shellBottomLeft, .shellBottomRight { display: none; } .naked { color: ButtonText; background-color: transparent; font-weight: normal; } td.naked { padding: 0; margin: 0; border: 0; } a:link { color: darkblue; text-decoration: none; } a:visited { color: darkblue; text-decoration: none; } A:link:hover, A:visited:hover { text-decoration: underline; } submit { color: ButtonText; background-color: ThreeDFace; } table.head { width: 100%; color: ButtonText; background-color: ActiveCaption; border: 2px outset ActiveBorder; margin: 0; } td.settingsPanel { border: 2px groove ActiveBorder; padding: 5px; } .head { font-weight: bold; color: CaptionText; margin: 0; } .head a { text-decoration: none; color: ActiveCaption; // color: CaptionText; /* hack that fixes head on IE and Konq */ vertical-align: middle; } .head a:after { /* Close button in Mozilla */ content:" X "; font-weight: bold; border: 1px outset ActiveBorder; color: ButtonText; background-color: ButtonFace; } td.head:before { /* POPFile "icon" for Mozilla */ content:"@ "; font-weight: bold; color: red; background-color: transparent; } .head a:hover { color: red; text-decoration: none; } .menu { padding: 0; margin: 0; } table.menu { padding-top: 5px; } .menu A, .menu A:hover { color: ButtonText; text-decoration: none; font-weight: normal; } .menuSelected { padding: 0; } .menuSelected a { Color: ButtonText; background-color: ThreeDFace; border-style: outset outset none; border-color: ActiveBorder; border-width: 2px; padding-top: 1px; padding-left: 5px; padding-right: 5px; padding-bottom: 6px; text-decoration: none; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; } .menuStandard { padding: 0; padding-top: 6px; padding-bottom: 1px; } .menuStandard a { color: ButtonText; background-color: ThreeDFace; border-style: outset outset none; border-color: ActiveBorder; border-width: 2px; padding-top: 1px; padding-left: 5px; padding-right: 5px; padding-bottom: 1px; text-decoration: none; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; } .menuSpacer { display: none; } .menuIndent { display: none; } .menuStandard a:hover, .menuSelected a:hover { /* required for Konqueror to not show default hover color */ text-decoration: none; color: ButtonText; } .menuStandard a:visited, .menuSelected a:visited { /* required for IE 6 to leave the visited menu text black */ text-decoration: none; color: ButtonText; } h2 { font-weight: bold; font-size: 1.2em; } th.historyLabel { text-align: left; } tr.rowEven { background-color: transparent; /* If you would like more color try lightblue. */ } tr.rowOdd { background-color: lightgrey; /* Try AppWorkspace if you would like a system color along with transparent */ } tr.rowHighlighted { background-color: InfoBackground; } tr.rowOdd:hover, tr.rowEven:hover { background-color: InfoBackground; } .footer { color: InfoText; border: 1px solid black; background-color: InfoBackground; font-weight: normal; margin: auto; /* this gives actual table centering in some browsers */ margin-top: 1em; text-align: center; /* this works in IE 6 */ } td.footerBody { text-align: center; padding-top: 2px; padding-bottom: 2px; } table.footer br { display: none; } .bottomLink { margin: 1em; } .bottomLink img { display: none; } td.stabColor01 { border: 1px outset ActiveBorder; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } td.historyNavigatorTop { text-align: right; padding-right: 0.5em; } td.historyNavigatorBottom { text-align: right; padding-right: 0.5em; padding-bottom: 1em; } .historyWidgetsTop { border-top: none; border-bottom: none; width: 100%; } .historyTable { border-top: none; border-bottom: none; width: 100%; } .openMessageTable, .lookupResultsTable { border-width: 2px; border-style: inset; } .openMessageCloser { text-align: right; font-size: larger; font-weight: bold; } .openMessageBody { font-size: 1em; text-align: left; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } div.securityExplanation { margin-left: 0.8em; margin-right: 0.8em; margin-bottom: 0.8em; margin-top: 0; font-size: 95%; } div.helpMessage { background-color: InfoBackground; border: 1px solid black; padding: 0.4em; margin: 0.3em; } div.helpMessage form { margin: 0; } span.graphFont { font-size: 95%; } tr.rowBoundary { background-color: InfoBackground; } table.settingsTable + br { display: none; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.3em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } /*********************************************************/ /* Customizations */ /* - uncomment this section if you want On text to be bold .bucketsWidgetStateOn, .configWidgetStateOn, .securityWidgetStateOn { font-weight: bold; } */ /* - uncomment this section for small version and adjust the percent as needed * { font-size: 98%; } */ div.historySearchFilterActive { background-color: lightgrey; }popfile-1.1.3+dfsg/skins/white/0000775000175000017500000000000011710356074015620 5ustar danieldanielpopfile-1.1.3+dfsg/skins/white/style.css0000664000175000017500000000617311624177324017504 0ustar danieldaniel/* White by Justin Bell (jaymz668) */ body { background-color: #FFFFFF; font-family: sans-serif; color: Black; } .shell, .shellTop { background-color: white; border: 3px #778899 solid; color: Black; } .menu { font-size: 14pt; font-weight: bold; width: 100%; } .menuSelected { background-color: #cccccc; width: 150px; border-style: solid; border-width: 2px; border-color: #335D99; color: Black; } .menuStandard { background-color: white; width: 150px; border-style: solid; border-width: 1px; border-color: #778899; color: Black; } tr.rowEven { background-color: white; color: Black; } tr.rowOdd { background-color: #EEEEEE; color: Black; } td.head { font-weight: normal; font-size: 22pt; background-color: white; color: black; } table.head { font-weight: normal; width: 100%; background-color: white; color: black; } .menuIndent { width: 8%; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } td.historyNavigatorTop { text-align: right; padding-right: 0.5em; } td.historyNavigatorBottom { text-align: right; padding-right: 0.5em; padding-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-left: 0.5em; margin-top: 1.5em; } td.logo2menuSpace { height: 0.8em; } table.footer { width: 100%; margin-top: 1em; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } td.openMessageCloser { text-align: right; } a.changeSettingLink { background-color: transparent ; color: #0000cc ; } tr.rowHighlighted { background-color: #000000; color: #eeeeee; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } span.graphFont { font-size: x-small; } .bucketsLabel { font-weight: bold; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } td.settingsPanel { border: 1px solid #EEEEEE; } tr.rowBoundary { background-color: #EEEEEE; height: 0.3em; } div.helpMessage { background-color: #EEEEEE; border: 2px solid #778899; padding: 0.3em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #EEEEEE; }popfile-1.1.3+dfsg/skins/tinygrey/0000775000175000017500000000000011710356074016352 5ustar danieldanielpopfile-1.1.3+dfsg/skins/tinygrey/style.css0000664000175000017500000002002711624177324020230 0ustar danieldanielbody { background-color: #FFFFFF; border: none; font-family: sans-serif; color: black; font-size: 80%; } .shell { background-color: #ffffff; border: 1px #666699 solid; color: black; } .shellTop { background-color: #dddddd; border: 1px #666699 solid; color: black; width: 90%; } table.head { background: #d0d0d0; width: 100%; color: #3333ee; } td.head { font-weight: bold; font-size: 75%; } .menu { font-size: 95%; font-weight: bold; width: 100%; } .menuIndent { width: 14%; } .menuSelected { background-color: #cccccc; color: #000000; width: 12%; font-size: 100%; border-top: 2px #6666aa solid; border-left: 2px #6666aa solid; border-right: 2px #6666aa solid; } .menuStandard { background-color: #efefef; color: #0000ff; width: 12%; font-size: 100%; border-color: #ddddff; border-style: solid solid none solid; border-width: 2px; } .menuStandard .menuLink { text-decoration: none; background-color: transparent; color: #0000ff; } .menuSelected .menuLink { text-decoration: none; background-color: transparent; color: #555555; } a.menuLink:hover { background-color: transparent; color: #E80000; text-decoration: none; } tr.rowEven { background-color: #cccccc; color: black; font-size: 80%; } tr.rowOdd { background-color: #ffffff; color: black; font-size: 80%; } tr.rowHighlighted { background-color: #666666 ; color: #eeeeee ; font-size: 80%; } hr { color: gray; background-color: transparent; } table.settingsTable { border: 1px solid Gray; } table.openMessageTable, table.lookupResultsTable { border: 2px solid Gray; } td.settingsPanel { border: 1px solid Gray; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.footerBody { text-align: center; padding-top: 0.8em; font-size: 75%; margin: auto; } td.naked { padding: 0px; margin: 0px; border: none } table.footer { width: 100%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: 65%; } .historyLabel { background-color: transparent; color: #434fa0; font-size: 75%; font-weight: bold; text-align: center; } .historyLabel a{ text-decoration: none; color: #434fa0; background-color: transparent; } .historyLabel a:hover { background-color: transparent; color: #cc1144; } .historyLabel em { font-style: normal; background-color: transparent; color: #cc1144; } .bucketsWidgetStateOn { font-weight: bold; background-color: transparent; color: #434fa0; font-size: 90%; } .bucketsWidgetStateOff { font-weight: bold; background-color: transparent; color: #434fa0; font-size: 90%; } .bucketsLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; text-align: center; } .magnetsLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; } .securityLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; } .configurationLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; text-align: left; } .advancedLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; } .passwordLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; } .sessionLabel { background-color: transparent; color: #434fa0; font-weight: bold; font-size: 75%; } td.logo2menuSpace { height: 0.8em; } a.messageLink { background-color: transparent; color: #3172b0; } a.messageLink:hover { background-color: transparent; color: #cc5566; } a.shutdownLink, a.logoutLink { background-color: transparent; color: #775555; text-decoration: none; font-size: 70%; font-weight: bold; } a.shutdownLink:hover, a.logoutLink:hover { background-color: transparent; color: #dd0000; text-decoration: none; } a.bottomLink { text-decoration: none; color: #000088; background-color: transparent; } a.bottomLink:hover { background-color: transparent; color: #cc1144; text-decoration: none; } h2 { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } div.bucketsMaintenanceWidget { padding-left: 5%; } div.bucketsLookupWidget { padding-left: 5%; } div.magnetsNewWidget { padding-left: 5%; } span.securityWidgetStateOn { color: #298841; background-color: transparent; margin-left: 1em; font-weight: bold; font-size: 75%; } span.securityWidgetStateOff { color: #298841; background-color: transparent; margin-left: 1em; font-weight: bold; font-size: 75%; } div.securityPassWidget { padding-left: 10%; } div.securityAuthWidgets { padding-left: 36%; padding-bottom: 0.8em; } div.securityExplanation { margin-left: 0.8em; margin-right: 0.7em; margin-bottom: 0.8em; margin-top: 1.0em; font-size: 75%; } h2.advanced { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } .advancedAlphabet { color: #309040; background-color: transparent; font-size: 90%; padding-left: 0.6em; } .advancedAlphabetGroupSpacing { color: #309040; background-color: transparent; font-size: 90%; padding-left: 0.6em; padding-top: 1.0em; } .advancedWords { padding-left: 0.6em; font-size: 80% ; } .advancedWordsGroupSpacing { padding-left: 0.6em; padding-top: 1.2em; font-size: 80% ; } .advancedGroupSpacing { height: 2.5em; vertical-align: text-bottom; padding-top: 1em; } div.advancedWidgets { padding-left: 36%; padding-bottom: 1.0em; } .historyWidgetsTop { width: 100%; padding: 0; margin-top: 0; margin-bottom: 1.0em; } .historyWidgetsBottom { width: 100%; margin-left: 1.5em; margin-top: 1.0em; } td.historyNavigatorTop, td.historyNavigatorBottom { text-align: right; padding-right: 0.5em; font-size: 80%; } .lineImg { width: 0.2em; } .colorChooserImg { width: 0.3em; } .submit { font-size: 67%; } input { font-size: 70%; } select { font-size: 70%; } .rowOdd select { font-size: 100%; } .rowEven select { font-size: 100%; } .reclassifyButton { font-size: 75%; } .rowOdd .deleteButton { font-size: 75%; } .rowEven .deleteButton { font-size: 75%; } .configWidgetStateOn { color: #298841; background-color: transparent; font-weight: bold; font-size: 75%; } .configWidgetStateOff { color: #298841; background-color: transparent; font-weight: bold; font-size: 75%; } .magnetsTable caption { font-size: 85%; width: 100%; text-align: left; margin-bottom: 1.0em; } tr.rowBoundary { background-color: #cccccc; } optgroup { font-size: inherit; /* fix Moz 1.0 bug with % font sizes */ } /*********************************************************/ /* Shell structure */ .shellStatusMessage { color: #000000; background-color: #cccccc; border: 1px solid #666699; width: 100%; } .shellErrorMessage { color: #FF0000; background-color: #cccccc; border: 1px solid #666699; width: 100%; } /*********************************************************/ /* Menu Settings */ .menuLink { display: block; width: 100%; } /*********************************************************/ /* Messages */ div.helpMessage { background-color: #cccccc; border: 1px solid #666699; padding: 0.4em; font-size: 80%; } div.helpMessage form { margin: 0; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; } div.historySearchFilterActive { border: 2px #ddddff solid; background-color: #eeeeee; }popfile-1.1.3+dfsg/skins/strawberryrose/0000775000175000017500000000000011710356074017575 5ustar danieldanielpopfile-1.1.3+dfsg/skins/strawberryrose/style.css0000664000175000017500000002360511624177324021460 0ustar danieldaniel/* StrawberryRose by David Smith (kinematics) */ /*********************************************************/ /* da Big Kahuna */ body { background-color: #FAC; border: none; font-family: verdana, arial, sans-serif; color: black; font-size: 80%; margin: 10px 20px 20px 20px; } /*********************************************************/ /* General element settings */ h2 { font-family: verdana, arial, sans-serif; font-size: 1.2em; font-weight: bold; color: white; background-color: transparent; } hr { color: #CC1133; background-color: #CC1133; } th { font-family: verdana, arial, sans-serif; font-weight: bold; } td { font-family: verdana, arial, sans-serif; } /* An undecorated table cell - center of shell tables */ td.naked { padding: 0; margin: 0; border: 0; } /* Text input and drop-down selections */ input, select, textarea { color: black; background-color: #FFCFCF; border: 1px black solid; font-weight: bold; font-family: verdana, arial, sans-serif; } /* Checkboxes */ .checkbox { color: black; background-color: transparent; border: 0; } /*********************************************************/ /* Button settings */ /* All buttons */ .submit, .toggleOn, .toggleOff, .reclassifyButton, .deleteButton, .undoButton { color: #FFFFFF; font-family: verdana, arial, sans-serif; padding-left:0; padding-right:0; } .submit:active, .toggleOn:active, .toggleOff:active, .reclassifyButton:active, .deleteButton:active, .undoButton:active { color: #FFFFFF; } /* Basic Buttons (input tags with class "submit") */ .submit { background-color: #870701; border: 2px darkred outset; } .submit:active, .submit:hover { border: 2px red inset; } /* Toggle Buttons */ .toggleOn { background-color: green; border: 2px red outset; } .toggleOn:active, .toggleOn:hover { background-color: green; border: 2px red inset; } .toggleOff { background-color: rgb(223,32,32); border: 2px red outset; } .toggleOff:active, .toggleOff:hover { background-color: rgb(223,32,32); border: 2px red inset; } /* Delete buttons */ .deleteButton { background-color: #870701; border: 2px red outset; } .deleteButton:active { background-color: #870701; border: 2px red inset; } /* Remove Messages buttons */ .removeButton { background-color: #EF2C54; border: 2px red outset; } .removeButton:active { border: 2px red inset; } /* Undo buttons */ .undoButton { background-color: #2C0074; border: 2px red outset; } .undoButton:active { background-color: #400020; border: 2px red inset; } .reclassifyButton { background-color: #4b09b7; border: 2px red outset; } .reclassifyButton:active { background-color: #400040; border: 2px red inset; } /* Reverse the color for Stealth Mode/Server Operation buttons */ .securityServerWidget input.toggleOn { color: #FFFFFF; background-color: rgb(223,32,32); } .securityServerWidget input.toggleOff { color: #FFFFFF; background-color: green; } /*********************************************************/ /* Global link rules */ :link, :visited { text-decoration: none; } :link, :visited { color: black; background-color: transparent; } :link:hover, :visited:hover, :link:active, :visited:active, :link:focus, :visited:focus { color: black; background-color: #DB6479; } /*********************************************************/ /* Custom Link Rules */ /* The big Shutdown link */ .shutdownLink { font-weight: bold; color: black; background-color: transparent; } /* For links in the menu tabs */ .menuLink { font-weight:bold; color: black; background-color: transparent; display: block; width: 100%; } /* For column headers (for sorting) on the History page */ th.historyLabel a:link:focus, th.historyLabel a:visited:focus { color: #630601; background-color: #FFAACC; } th.historyLabel a:link, th.historyLabel a:visited { color: #F2F0F0; } th.historyLabel a:link:hover, th.historyLabel a:visited:hover, th.historyLabel a:link:active, th.historyLabel a:visited:active { color: #630601; background-color: #FFAACC; } /* For the navigation pages on the History page */ td.historyNavigatorTop a:link, td.historyNavigatorBottom a:link, td.historyNavigatorTop a:visited, td.historyNavigatorBottom a:visited { color: rgb(99, 6, 1); background-color: rgb(220, 90, 110); } td.historyNavigatorTop a:link:hover, td.historyNavigatorBottom a:link:hover, td.historyNavigatorTop a:visited:hover, td.historyNavigatorBottom a:visited:hover { color: rgb(99, 6, 1); background-color: rgb(255, 170, 204); } /* For viewing messages on the History page */ .messageLink { text-decoration: underline; } /* For the download log file link on the Configuration Page */ .downloadLogLink { text-decoration: underline; color: rgb(99, 6, 1); background-color: rgb(220, 90, 110); } /* For wordlist page */ .wordListLink:link:hover, .wordListLink:visited:hover { color: black; background-color: #FFAACC; } /*********************************************************/ /* Major layout elements */ /* Main tables, except footer */ .shell, .shellTop { color: #EEEEEE; background-color: #CC1133; border-style: ridge; border-color: #FFFFFF; border-width: 2px; margin: 0; } /* The header table inside a shell table at the top of the page */ table.head { width: 100%; color: #808080; font-family: verdana, arial, sans-serif; font-weight: bold; background: #FFEFEF; border-style: groove; border-color: #EEE; border-width: 2px; margin: 0; } td.head { font-weight: bold; font-size: 1em; } /* Spacing between header and main */ td.logo2menuSpace { height: 0.8em; } /* The footer table at the bottom of the page */ table.footer { width: 100%; color: #808080; background-color: #FFEFEF; border-style: ridge; border-color: #EEE; border-width: 2px; margin: 1em 0 0 0; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } /*********************************************************/ /* Main Menu Navigation */ /* Menu Tabs' Table */ .menu { font-size: 1em; font-weight: bold; width: 100%; } /* Spacing on either side of tabs */ .menuIndent { width: 8%; } /* Spacing in between tabs (usually automatic) */ .menuSpacer { } /* All tabs except currently active tab */ .menuStandard { background-color: #DBDF37; width: 14%; border-color: #FFFFFF; border-style: ridge ridge none ridge; border-width: 2px; color: black; } /* Currently active tab */ .menuSelected { background-color: #7CE238; width: 14%; border-color: #FFFFFF; border-style: ridge ridge none ridge; border-width: 2px; color: black; } /*********************************************************/ /* General settings tables and panels */ table.settingsTable { border: 1px solid #CC1133; } td.settingsPanel { border: 1px solid #DB6479; color: #EEEEEE; background-color: #CC1133; } /*********************************************************/ /* History page settings */ table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop, td.historyNavigatorBottom { text-align: right; } table.historyTable { border-collapse: collapse; border: 0; } tr.rowHighlighted { color: black; background-color: #7CE238; } .historyTable td { border-right: 2px solid #C13; } /* Don't put borders in the top20 table */ .top20 td { border-right: 0; } /* Open message table */ table.openMessageTable { border: 2px solid black; } /* Don't put borders in the openMessage table */ table.openMessageTable td { border-right: 0; } td.openMessageBody { color: black; background-color: rgb(250,220,220); font-size: 1.2em; } td.openMessageCloser { text-align: right; color: black; font-weight: bold; } td.openMessageCloser a { background-color: #7CE238; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } /* Top-20 stuff */ .top20Buckets { width: 100%; color: black; background-color: rgb(250,220,220); } .top20Words { width: 100%; color: black; background-color: rgb(250,220,220); } /*********************************************************/ /* Graphic colors, bars, etc */ /* Bucket and history listings alternating row colors */ tr.rowOdd { color: black; background-color: #C2DC87; } tr.rowEven { color: black; background-color: #A4CA4A; } /* Accuracy statistics bar colors */ .accuracy0to49 { color: black; background-color: red; } .accuracy50to93 { color: black; background-color: yellow; } .accuracy94to100 { color: black; background-color: green; } .lineImg { width: 0.3em; } /* Bar chart legend font */ span.graphFont { font-size: x-small; } /*********************************************************/ /* Labels */ .historyLabel { font-weight: normal; } .historyLabelSort { font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .configWidgetStateOn, .bucketsWidgetStateOn, .securityWidgetStateOn { font-weight: bold; } /*********************************************************/ /* Messages */ div.error01 { color: red; background-color: black; font-size: larger; } div.error02 { color: red; background-color: black; } div.helpMessage { background-color: #A4CA4A; border: 1px solid transparent; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Other stuff */ .advancedWidgets { margin-top: 1em; } .checkLabel { border: 1px solid #DB6479; } div.historySearchFilterActive { color: black; background-color: #C2DC87; }popfile-1.1.3+dfsg/skins/smallgrey/0000775000175000017500000000000011710356074016477 5ustar danieldanielpopfile-1.1.3+dfsg/skins/smallgrey/style.css0000664000175000017500000001355011624177324020360 0ustar danieldanielH2 { font-size: 170%; font-weight: normal; } body { background-color: #ffffff; border: none; font-family: tahoma, sans-serif; font-size: 66%; font-weight: normal; color: #000000; margin: 3px; } table.head { width: 100%; } .headShutdown { font-size: 80%; } .headShutdown a { color: #990000; text-decoration: none; } .shutdownLink:hover, .logoutLink:hover { text-decoration: underline; } .shellTopRow, .shellLeft, .shellBottomRow, .shellRight { visibility: hidden; display: none; } .head { font-weight: bold; font-size: 140%; background-color: #eeeeee; color: #666666; padding-left: 5px; } .shell, .shellTop { border: 2px #cccccc solid; margin: 0px; padding: 0px; } .shell { color: #000000; background-color: #ffffff; } .shellTop { color: #000000; background-color: #eeeeee; } .head a { font-size: 120%; font-weight: normal; } .menu { font-size: 140%; font-weight: normal; width: 100%; } .menuIndent { width: 5%; } .menuSelected, .menuSelected a { background-color: #cccccc; color: #000000; font-weight: bold; text-decoration: none; } .menuSelected { border: 2px solid #cccccc; border-bottom: 0; padding-left: 2px; padding-right: 2px; margin-left: 2px; margin-right: 2px; width: 15%; } .menuStandard, .menuStandard a { background-color: #efefef; color: #0000ff; font-weight: bold; text-decoration: none; } td.menuStandard { border-left: 2px solid #cccccc; border-right: 2px solid #cccccc; border-top: 2px solid #cccccc; padding-left: 2px; padding-right: 2px; margin-left: 2px; margin-right: 2px; width: 15%; } .menuStandard a:hover { text-decoration: underline; } .rowEven { background-color: #f7f7f7; color: #000000; } .rowOdd { background-color: #eeeeee; color: #000000; } .rowEven a, .rowOdd a { text-decoration: none; } .rowEven a:hover, .rowOdd a:hover { color: #000000; background-color: #ffffcc; } .colorChooserImg { height: 100%; width: 0.7em; } .colorChooserTable a:hover { background-color: transparent; color: inherit; } .lineImg { width: 4px; } tr.rowHighlighted { background-color: #ffffcc; color: #666666; } table.settingsTable, td.settingsPanel { border: 1px solid #cccccc; padding: 3px; margin: 2px; } table.openMessageTable, table.lookupResultsTable { border: 2px solid Black; padding: 2px; margin: 0px; } td.naked { padding: 0px; margin: 0px; border: none; } td.accuracy0to49 { background-color: red; color: #666666; height: 20px; } td.accuracy50to93 { background-color: yellow; color: #666666; height: 20px; } td.accuracy94to100 { background-color: green; color: #666666; height: 20px; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } td.historyNavigatorTop { text-align: right; padding-right: 5px; } .historyNavigatorTop a:hover, .historyNavigatorBottom a:hover { background-color: #eeeeee; color: #000000; } td.openMessageCloser { text-align: right; } .historyLabel, .historyLabel a { font-weight: bold; font-size: 110%; text-decoration: none; } .historyLabel em { font-weight: bold; font-style: normal; background-color: #f7f7f7; } .historyLabel :hover { text-decoration: underline; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: normal; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } table.historyWidgetsTop { width: 100%; border-top: 2px solid #cccccc; border-bottom: 2px solid #cccccc; text-align: center; } .historyWidgetsTop.submit { margin-right: 1.5em; } table.historyWidgetsBottom { width: 100%; border-bottom: 2px solid #cccccc; } table.historyWidgetsBottom td { padding-left: 1em; font-weight: bold; } table.footer { width: 100%; background-color: #eeeeee; color: #666666; border: 2px solid #cccccc; border-top: 0; } td.footerBody { text-align: center; padding-left: 1%; padding-right: 1%; font-size: 100%; font-weight: bold; } .bottomLink { text-decoration: none; } .bottomLink:hover { background-color: #ffffcc; color: #000000; } input, .submit, select { font-family: tahoma, sans-serif; font-size: 100%; font-weight: normal; padding: 0px; margin: 0px; } tt { font-family: "lucida console", courier, sans-serif; font-size: 105%; font-weight: normal; } span.bucketsWidgetStateOn { font-weight: bold; } span.configWidgetStateOn { font-weight: bold; } span.securityWidgetStateOn { font-weight: bold; } span.bucketsWidgetStateOff { background-color: inherit; color: #666666; } span.configWidgetStateOff { background-color: inherit; color: #666666; } span.securityWidgetStateOff { background-color: inherit; color: #666666; } .toggleOn { background-color: #dddddd; color: #000000; } .toggleOff { background-color: #bbbbbb; color: #000000; } .bucketsTable input { font-size: 90%; border: 1px; } button, .submit, .reclassifyButton { background-color: #dddddd; color: #000000; } .deleteButton, .historyWidgetsBottom .submit { background-color: #bbbbbb; color: #000000; } tr.rowBoundary { background-color: transparent; height: 0.3em; } optgroup { font-size: inherit; /* fix Moz 1.0 bug with % font sizes */ } div.helpMessage { background-color: #f7f7f7; border: 1px solid #cccccc; padding: 0.3em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:90%; vertical-align: middle; } div.historySearchFilterActive { border: 2px #cccccc solid; background-color: #eeeeee; }popfile-1.1.3+dfsg/skins/smalldefault/0000775000175000017500000000000011710356074017155 5ustar danieldanielpopfile-1.1.3+dfsg/skins/smalldefault/style.css0000664000175000017500000001513511624177326021041 0ustar danieldaniel/*********************************************************/ /* Main Body */ body { background-color: #FFFFFF; font-family: tahoma, sans-serif; font-size: 0.7em; font-weight: normal; color: #000000; margin: 3px; } /*********************************************************/ /* Shell structure */ .shell, .shellTop { color: #000000; background-color: #EDEDCA; border: 2px #CCCC99 solid; margin: 0; padding: 0; border-collapse: collapse; } .shellStatusMessage { color: #000000; background-color: #EDEDCA; border: 3px #CCCC99 solid; width: 100%; } .shellErrorMessage { color: #FF0000; background-color: #EDEDCA; border: 3px #CCCC99 solid; width: 100%; } table.head { font-weight: normal; width: 100%; } td.head { font-weight: bold; font-size: 1.4em; color: #666666; } .head a { font-size: 1.2em; font-weight: normal; text-decoration: none; } .head a:hover { text-decoration: underline; } table.footer { width: 100%; color: #666666; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; font-size: 1em; } .bottomLink { text-decoration: none; } .bottomLink:hover { text-decoration: underline; } td.naked { padding: 0; margin: 0; border: 0; } td.accuracy0to49 { background-color: red; color: black; height: 20px; } td.accuracy50to93 { background-color: yellow; color: black; height: 20px; } td.accuracy94to100 { background-color: green; color: black; height: 20px; } td.logo2menuSpace { height: 0.8em; } /*********************************************************/ /* Menu Settings */ .menu { width: 100%; } .menuSelected { background-color: #CCCC99; padding: 0 2px; margin: 0 2px; width: 15%; } .menuSelected, .menuSelected a { color: #000000; font-size: 1.1em; font-weight: bold; text-decoration: none; } .menuStandard { border: 2px solid #CCCC99; border-bottom: none; padding: 0 2px; margin: 0 2px; width: 15%; } .menuStandard, .menuStandard a { background-color: #EDEDCA; color: #0000ff; font-size: 1.1em; font-weight: bold; text-decoration: none; } .menuSelected a:hover, .menuStandard a:hover { text-decoration: underline; } .menuIndent { width: 5%; } .menuLink { display: block; width: 100%; } /*********************************************************/ /* Table Settings */ table.settingsTable { border: 1px solid #CCCC99; padding: 3px; margin: 0px; } td.settingsPanel { border: 1px solid #CCCC99; padding: 3px; margin: 0px; } table.openMessageTable { border: 2px solid #CCCC99; padding: 2px; margin: 0px; } td.openMessageBody { text-align: left; } td.openMessageCloser { text-align: right; } tr.rowEven { color: #000000; background-color: #EDEDCA; } tr.rowOdd { color: #000000; background-color: #CCCC99; } tr.rowEven a, tr.rowOdd a { text-decoration: none; } tr.rowEven a:hover, tr.rowOdd a:hover { text-decoration: underline; } tr.rowEven:hover, tr.rowOdd:hover { color: #000000; background-color: #FFFFCC; } tr.rowHighlighted { color: #000000; background-color: #B7B7B7; } tr.rowBoundary { background-color: #CCCC99; } table.lookupResultsTable { border: 2px solid #CCCC99; } td.naked { padding: 0; margin: 0; border: 0; } /*********************************************************/ /* Messages */ div.helpMessage { background-color: #DFDFAF; border: 2px solid #CCCC99; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; font-weight: normal; font-size: 1.1em; text-decoration: none; } em.historyLabelSort { font-weight: bold; font-style: normal; } th.historyLabel a { text-decoration: none; } th.historyLabel a:hover { text-decoration: underline; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: normal; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .bucketsWidgetStateOn, .bucketsWidgetStateOff { font-weight: bold; } .configWidgetStateOn, .configWidgetStateOff { font-weight: bold; } .securityWidgetStateOn, .securityWidgetStateOff { font-weight: bold; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop a, .historyNavigatorBottom a { text-decoration: none; } .historyNavigatorTop a:hover, .historyNavigatorBottom a:hover { text-decoration: underline; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } .magnetsTable caption { text-align: left; } h2.history { margin-top: 0; margin-bottom: 0.2em; font-size: 1.5em; font-weight: normal; } .search { display: inline; float: left; padding-right: 0.4em; } .filter { display: inline; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } /*********************************************************/ /* Config Bar */ .configBar { padding-top: 1em; } .configBarTitle { display: inline; font-size: 1.1em; } .configBarTitle a { border: 2px #CCCC99 solid; padding: 0.3em; padding-bottom: 0; margin-left: 0.3em; background-color: #CCCC99; font-weight: bold; font-size: 1.1em; text-decoration: none; } .configBarTitle a:hover { text-decoration: underline; } .configBarBody { background-color: #DFDFAF; border: 1px solid #CCCC99; } .configBarBody td { border: 1px solid #CCCC99; } .configBarBody form { margin: 0; } .configBarOption { border: 1px solid #CCCC99; margin: 0.3em; padding: 0.3em; display: inline; float: left; min-height: 3em; background-color: #EDEDCA; } .checkLabel { border: 1px solid #CCCC99; white-space: nowrap; } .configBarBody input.submit { margin-top: 0.1em; } .configBarBody label.configurationLabel { display: block; } /*********************************************************/ /* History Column Controls */ .columnControls { white-space:nowrap; vertical-align: top; width: 10px; } .columnRemove, .columnMove { display: block; width: 100%; height: 1em; } /*********************************************************/ input, select, .submit { font-family: tahoma, sans-serif; font-size: 1em; font-weight: normal; padding: 0; margin: 0; } tt { font-family: "lucida console", courier, sans-serif; font-size: 1.1em; font-weight: normal; } div.historySearchFilterActive { background-color: #CCCC99; }popfile-1.1.3+dfsg/skins/sleet/0000775000175000017500000000000011710356074015614 5ustar danieldanielpopfile-1.1.3+dfsg/skins/sleet/topRight.gif0000664000175000017500000000225011624177326020107 0ustar danieldanielGIF89a!)!)!!)!!1!)1))9)19)1B11B11J19B19J99R9BR9BZBBRBJRBJcJRkJRsJZsRZ{RcЩZcZc慶k把s很k{ks徭sг{ュs┓s┠{{к{鶏┠{舷т隙売券犯血伯懸粕・恃・惧・惧ュ・・ュ・・オュ・オュュオュュスオュスオオスオオニスオニススニススホニスホニニホニニヨホニホホニヨホホヨヨボヨヨ゙゙ヨ!,-HーチM0ーター。テセ(∞遂3b "c(,ャ0a。$'S「\I4HXPq"ト Grワ簒ネ!>lエa。ч~)b、髏ヲF2T 「#F`C」ラ=lネ曹(圧,ツH生lテナP rテG~チ紮 コ-ョZ霏。テ6v,yイ7トメu。xテ ヤネ。」4鰓:rヲn ッフクAサ6メ82ヒリ\ヨ ソネィQテF8Lッヲ C1 マトAc7v\V]ブw%HA襟2ョチCコス4pタ1dワD.ニyテ] (P (ク >t驢話$p C ? Aト?@ィテ{.、 `"瑞SE2ラPミH,「$゙%@トFネ(b罪);popfile-1.1.3+dfsg/skins/sleet/topLeft.gif0000664000175000017500000000176011624177326017731 0ustar danieldanielGIF89a!)!)!!1))9))B)1B11J19J99R9BZBBcBJkJRsRZ{RZЩc慶k婆s很s・s{ュ{┠{舷釆!,ヘミチリ ε#J|HPη3jト ユ C6娃、ノ(Sテ0cハ忱▼ヒ 8sワノモ諷  J畑O*]ハt餡 "H扣オヤァQ・Bミハ5ツVッ^アJ}@カャルウトFHAロキn羝U娵!B=カ ulチ L#^\クチD,Yrリフケeネ0Z衫。Pヘ:タg。80 ;popfile-1.1.3+dfsg/skins/sleet/top.gif0000664000175000017500000000147611624177326017122 0ustar danieldanielGIF89a)!!1))911J99R9BZBJkJRsRZ{Zc慶k婆s徭{ュ{┠{舷釆!,Dツ ,P  @@;popfile-1.1.3+dfsg/skins/sleet/style.css0000664000175000017500000001423411624177326017477 0ustar danieldaniel/* Sleet by Dan Martin (kraelen) */ body { margin: 1%; color: #FFFFFF; background-color: #7988A5; font-family: sans-serif; font-size: 67%; } h2 { font-weight: bold; font-size: 1.5em; } hr { color: #888888; background-color: transparent; height: 1px; } select, input, textarea { border: 1px outset #000000; background-color: #BAB8C6; color: black; font-weight: normal; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; } * html .checkbox { border: none; background-color: transparent; } .submit, .toggleOn, .toggleOff, .deleteButton, .undoButton, .reclassifyButton { border: none; color: #FFFFFF; background: url(button.gif) no-repeat; font-size: 1em; font-weight: bold; margin: 0; padding: 0; height: 22px; width: 99px; cursor: pointer; } .helpMessage .submit, .toggleOn, .toggleOff, .removeButton { background: url(button2.gif) repeat; width: auto; padding: 0 1em 0 1em; } .shell, .shellTop { background-color: #424d63; color: #FFFFFF; border-collapse: collapse; border-spacing: 0px; } .shellTopCenter { height: 21px; padding: 0; margin: 0; border: none; background-image: url(top.gif); background-repeat: repeat-x; } .shellTopLeft { height: 21px; width: 27px; padding: 0; margin: 0; border: none; background-image: url(topLeft.gif); background-repeat: no-repeat; } .shellTopRight { height: 21px; width: 25px; padding: 0; margin: 0; border: none; background-image: url(topRight.gif); background-repeat: no-repeat; } .shellLeft { width: 27px; padding: 0; margin: 0; border: none; background-image: url(left.gif); background-repeat: repeat-y; } .shellRight { width: 25px; padding: 0; margin: 0; border: none; background-image: url(right.gif); background-repeat: repeat-y; } .shellBottomCenter { height: 22px; padding: 0; margin: 0; border: none; background-image: url(bottom.gif); background-repeat: repeat-x; } .shellBottomLeft { width: 27px; height: 22px; padding: 0; margin: 0; border: none; background-image: url(bottomLeft.gif); background-repeat: no-repeat; } .shellBottomRight { height: 22px; width: 25px; padding: 0; margin: 0; border: none; background-image: url(bottomRight.gif); background-repeat: no-repeat; } .naked { font-size: 1em; font-family: sans-serif; padding: 5px; } :link, :visited { font-size: 1em; text-decoration: underline; border: 0; } :link:focus, :visited:focus { color: #FFFFFF; background-color: transparent; } :link { color: #FFFFFF; background-color: transparent; } :visited { color: #FFFFFF; background-color: transparent; } :link:hover, :visited:hover { border: 1px #FFFFFF solid; } :link:active, :visited:active { color: #FFFFFF; background-color: transparent; } .menuLink:link, .menuLink:visited { color: #FFFFFF; background-color: transparent; text-decoration: none; font-weight: bold; } .menuLink:link:hover, .menuLink:visited:hover { border: 0; cursor: pointer; } .bottomLink:link, .bottomLink:visited { color: #000000; background-color: transparent; } .bottomLink:link:hover, .bottomLink:visited:hover { color: #000000; background-color: transparent; } .colorChooserLink:link:hover, .colorChooserLink:visited:hover { border: 0; } table.head { width: 100%; font-family: sans-serif; text-align: left; } td.head { font-weight: bold; font-size: 1.5em; font-family: arial, sans-serif; } .menu { background-image: url(menu.gif); font-weight: normal; font-size: 1.25em; width: 100%; } .menuStandard { background-image: url(menuButton.gif); width: 109px; height: 21px; background-repeat: no-repeat; text-align: center; } .menuSelected { background-image: url(menuButton.gif); width: 109px; height: 21px; background-repeat: no-repeat; text-align: center; } .menuIndent { color: #FFFFFF; background-color: #7988a5; padding: 0; margin: 0; width: 0; } .menuSpacer { padding: 0; margin: 0; width: 0; } .rowOdd { color: #FFFFFF; background-color: #545F74; } .rowOdd td { border-top: 1px #888888 solid; border-bottom: 1px #888888 solid; } .rowEven, .rowEven :link, .rowEven :visited { color: #BBBBBB; background-color: transparent; } .rowHighlighted { color: #EEEEEE; background-color: #545f74; } .openMessageTable, .lookupResultsTable { border: 1px solid #888888; color: #FFFFFF; background-color: #545F74; } .openMessageCloser { text-align: right; } .openMessageBody { font-size: 1.2em; text-align: left; } td.accuracy0to49 { color: black; background-color: red; } td.accuracy50to93 { color: black; background-color: yellow; } td.accuracy94to100 { color: black; background-color: green; } div.error01 { font-size: larger; color: red; background-color: transparent; } div.error02 { color: red; background-color: transparent; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabelSort { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .logo2menuSpace { height: 1em; } .settingsTable, .settingsPanel { border: 1px solid #888888; color: #FFFFFF; background-color: #545F74; } .footer { background-image: url(menu.gif); margin-top: 10px; margin-left: 8%; margin-right: 8%; height: 22px; width: 84%; font-size: 0.9em; background-color: transparent; color: #000000; } .historyNavigatorTop, .historyNavigatorBottom { text-align: right; } .lineImg { width: 4px; } .colorChooserTable td { border: 0; } table.footer br { display: none; } .bottomLink { margin: 1em; } .bottomLink img { display: none; } tr.rowBoundary { background-color: #888888; } div.helpMessage { background-color: #545F74; border: 1px solid #888888; padding: 0.4em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } div.historySearchFilterActive { color: black; background-image: url(menu.gif); }popfile-1.1.3+dfsg/skins/sleet/right.gif0000664000175000017500000000147711624177326017436 0ustar danieldanielGIF89aBBRkk{т伯懸粕・惧ュ・・ュュュスオオニススニニニヨホニヨヨヨ゙!,`A (Hチ 0@@;popfile-1.1.3+dfsg/skins/sleet/menuButton.gif0000664000175000017500000000261511624177326020454 0ustar danieldanielGIF89am)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,mHーっ*\ネー。テ廩ア 3jワネア」ヌ CぎPア、タ Pィ\ノイ・ヒ0cハ廬s&q鞋Y + Jエィム」H*]ェ5v腆u5*畑ノオォラッ^KTィaオ*;ミタa!Dp飜扛キョンサxン[";メヨ巣ーF森フクア翩#K朖ケイ蠻#"リ0#マ:cD0「エ鰌ィSォ^ヘコオラーKC'7pリQ。テ゚タ Nシク翳+゙。剤6tローq#ニイk゚ホスサ狹O~;1ヲ゚リ]」 6p楼ソセ゚マソソ4C{4ヤテ{4タミ@4鞨F(痲Vh痳>連0フ` ニ滷d`竕(ヲィ竓,カ鞣0ニ遺 ク"0ト Ppチ宗)苣Di苟H&ゥd,滷傘ツ -, チXfゥ蝟\v鱧輿)譏ZJー@ Sセ狡.エ青 @ 逵tヨi逹x讖迸|Ig 、タf-ー爬 0陲6陬色*鬢之ハh&、ミツヲ,ィPィ * 埖ィ、頬ゥィヲェェャカェゥl&ィ`隰棣j茗ョシッタ+ートZ@ャ*h嘯 "仟ャ" エヤVkオリfォカワvK-エヘ[婆ケ隕ォコカサ訪I 0タス讚セソ,ー%;popfile-1.1.3+dfsg/skins/sleet/menu.gif0000664000175000017500000000147411624177326017262 0ustar danieldanielGIF89assъ券血恃櫨惧ュ・・ュ・・オュュスオオニススニニスホニニヨホニヨホホヨヨヨ゙゙ヨ!,d瘁 $@p@ 0 ;popfile-1.1.3+dfsg/skins/sleet/left.gif0000664000175000017500000000150111624177326017237 0ustar danieldanielGIF89a)!!1))911J99R9BZBJkJRsRZ{Zc慶k婆s徭{ュ{┠{舷釆!,H !0X A 0 ;popfile-1.1.3+dfsg/skins/sleet/button2.gif0000664000175000017500000000147711624177326017716 0ustar danieldanielGIF89a)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,+@アナ #>x牴!テ $@`タ;popfile-1.1.3+dfsg/skins/sleet/button.gif0000664000175000017500000000233711624177326017630 0ustar danieldanielGIF89ac)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,cX。チ*\ネー。テJ$「「ナ3jワネア」ヌ+L、阿、ノ(Sェ\ノイ・ヒ.A枇8sワノウァマ檗 鰍トJタ\ハエゥモヲ%fー「ト沖Xウjンハオォラッ`テ-ツぢ#Hィ]ヒカュロキp飜扛キョレホ~チキッ゚ソ Lクー眦|?莚ミ痺翩#K朖ケイ衢3CPCMコエ鰌ィSォ^-堙8ネ朞サカロクs゙ヘサ7 dリ@シク翳+_ホシケ酥3ソ寸コリウk゚ホスサ牘ス_hーツ勒ォ_マセス耆OOaチ ゚マソソ(烙'± @烽 6鞨F(痲Vネ y$タタv鞦 (竏$防b 搬,カ鞣0ニ(繻4ヨh繼タ<鞳宗)苣Did dタ鱈6鱠撤F)蜚TViePタ暴v鱧輿)譏d吠譁L$タlカ鱶孅ニ)逵tヨi逹 ;popfile-1.1.3+dfsg/skins/sleet/bottomRight.gif0000664000175000017500000000205111624177326020610 0ustar danieldanielGIF89aBBRkk{ssт売券血伯懸粕・惧ュ・・ュ・・オュュスオオニススニニスホニニヨホニヨホホヨヨヨ゙゙ヨ!,ツ  8hミ≠  @@@P A。 (@ ア@ナ、\畫B BD`「ナ pトノQ!テ"I0ySツA」Gzゥ`、D"H 母ヤ.9萍ッ*W.lリT(TミェMヒ&SョD4XHwョンアZ扼<ルー/ソeF4、眦呟*イアヌ-y2チテヒ3c~ネjトマ@卒E暢Sォ^]艨^ヌ-サ6mル'c]カn゙` ユdヘO~|「r「K櫻スztイk゚ホスv呉テOc@;popfile-1.1.3+dfsg/skins/sleet/bottomLeft.gif0000664000175000017500000000230211624177326020424 0ustar danieldanielGIF89a!!)!)!!)!!1!)1!)9))9)19)1B11B11J19B19J19R99J99R9BR9BZBBRBBZBJRBJcBJkBRkJRkJRsJZsRZ{RcЩZcZcЩc兄k慶k把s把s很k{ks很{・ssг{・s{ュs┠{{鶏┠{舷т売券犯釆血恃櫨惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,9ワミqテ,R 「 (HPエ!ニ (H畏チd $芦"F v\。b。0Xpaナ 9謄G&F,y4nミ漾d薗「3k棄醒、┤0lリチツテ$X&]jツ/:ホ績Cエezヤzsテ%Xシ8x Dクカテ%Tャ`1ケイ Bメメエ2H(@.Q!f、JA(a「ョc利D3_#H葷Mすメ >N猶ADq"@ !Bヘュ;?azヤ5Hxョ蕨ヘ4d?^R@;popfile-1.1.3+dfsg/skins/sleet/bottom.gif0000664000175000017500000000147611624177326017624 0ustar danieldanielGIF89aBBRssъ券血恃櫨惧ュ・・オュュスオオニススニニニヨホニヨヨヨ゙!,Xミ $@pタ @`@;popfile-1.1.3+dfsg/skins/sleet-rtl/0000775000175000017500000000000011710356074016413 5ustar danieldanielpopfile-1.1.3+dfsg/skins/sleet-rtl/topRight.gif0000664000175000017500000000225011624177326020706 0ustar danieldanielGIF89a!)!)!!)!!1!)1))9)19)1B11B11J19B19J99R9BR9BZBBRBJRBJcJRkJRsJZsRZ{RcЩZcZc慶k把s很k{ks徭sг{ュs┓s┠{{к{鶏┠{舷т隙売券犯血伯懸粕・恃・惧・惧ュ・・ュ・・オュ・オュュオュュスオュスオオスオオニスオニススニススホニスホニニホニニヨホニホホニヨホホヨヨボヨヨ゙゙ヨ!,-HーチM0ーター。テセ(∞遂3b "c(,ャ0a。$'S「\I4HXPq"ト Grワ簒ネ!>lエa。ч~)b、髏ヲF2T 「#F`C」ラ=lネ曹(圧,ツH生lテナP rテG~チ紮 コ-ョZ霏。テ6v,yイ7トメu。xテ ヤネ。」4鰓:rヲn ッフクAサ6メ82ヒリ\ヨ ソネィQテF8Lッヲ C1 マトAc7v\V]ブw%HA襟2ョチCコス4pタ1dワD.ニyテ] (P (ク >t驢話$p C ? Aト?@ィテ{.、 `"瑞SE2ラPミH,「$゙%@トFネ(b罪);popfile-1.1.3+dfsg/skins/sleet-rtl/topLeft.gif0000664000175000017500000000176011624177326020530 0ustar danieldanielGIF89a!)!)!!1))9))B)1B11J19J99R9BZBBcBJkJRsRZ{RZЩc慶k婆s很s・s{ュ{┠{舷釆!,ヘミチリ ε#J|HPη3jト ユ C6娃、ノ(Sテ0cハ忱▼ヒ 8sワノモ諷  J畑O*]ハt餡 "H扣オヤァQ・Bミハ5ツVッ^アJ}@カャルウトFHAロキn羝U娵!B=カ ulチ L#^\クチD,Yrリフケeネ0Z衫。Pヘ:タg。80 ;popfile-1.1.3+dfsg/skins/sleet-rtl/top.gif0000664000175000017500000000147611624177326017721 0ustar danieldanielGIF89a)!!1))911J99R9BZBJkJRsRZ{Zc慶k婆s徭{ュ{┠{舷釆!,Dツ ,P  @@;popfile-1.1.3+dfsg/skins/sleet-rtl/style.css0000664000175000017500000001422511624177326020276 0ustar danieldaniel/* Sleet by Dan Martin (kraelen) */ body { margin: 1%; color: #FFFFFF; background-color: #7988A5; font-family: sans-serif; font-size: 67%; } h2 { font-weight: bold; font-size: 1.5em; } hr { color: #888888; background-color: transparent; height: 1px; } select, input, textarea { border: 1px outset #000000; background-color: #BAB8C6; color: black; font-weight: normal; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; } * html .checkbox { border: none; background-color: transparent; } .submit, .toggleOn, .toggleOff, .deleteButton, .undoButton, .reclassifyButton { border: none; color: #FFFFFF; background: url(button.gif) no-repeat; font-size: 1em; font-weight: bold; margin: 0; padding: 0; height: 22px; width: 99px; cursor: pointer; } .helpMessage .submit, .toggleOn, .toggleOff, .removeButton { background: url(button2.gif) repeat; width: auto; padding: 0 1em 0 1em; } .shell, .shellTop { background-color: #424d63; color: #FFFFFF; border-collapse: collapse; border-spacing: 0px; } .shellTopCenter { height: 21px; padding: 0; margin: 0; border: none; background-image: url(top.gif); background-repeat: repeat-x; } .shellTopLeft { height: 21px; width: 27px; padding: 0; margin: 0; border: none; background-image: url(topRight.gif); background-repeat: no-repeat; } .shellTopRight { height: 21px; width: 25px; padding: 0; margin: 0; border: none; background-image: url(topLeft.gif); background-repeat: no-repeat; } .shellLeft { width: 27px; padding: 0; margin: 0; border: none; background-image: url(right.gif); background-repeat: repeat-y; } .shellRight { width: 25px; padding: 0; margin: 0; border: none; background-image: url(left.gif); background-repeat: repeat-y; } .shellBottomCenter { height: 22px; padding: 0; margin: 0; border: none; background-image: url(bottom.gif); background-repeat: repeat-x; } .shellBottomLeft { width: 27px; height: 22px; padding: 0; margin: 0; border: none; background-image: url(bottomRight.gif); background-repeat: no-repeat; } .shellBottomRight { height: 22px; width: 25px; padding: 0; margin: 0; border: none; background-image: url(bottomLeft.gif); background-repeat: no-repeat; } .naked { font-size: 1em; font-family: sans-serif; padding: 5px; } :link, :visited { font-size: 1em; text-decoration: underline; border: 0; } :link:focus, :visited:focus { color: #FFFFFF; background-color: transparent; } :link { color: #FFFFFF; background-color: transparent; } :visited { color: #FFFFFF; background-color: transparent; } :link:hover, :visited:hover { border: 1px #FFFFFF solid; } :link:active, :visited:active { color: #FFFFFF; background-color: transparent; } .menuLink:link, .menuLink:visited { color: #FFFFFF; background-color: transparent; text-decoration: none; font-weight: bold; } .menuLink:link:hover, .menuLink:visited:hover { border: 0; cursor: pointer; } .bottomLink:link, .bottomLink:visited { color: #000000; background-color: transparent; } .bottomLink:link:hover, .bottomLink:visited:hover { color: #000000; background-color: transparent; } .colorChooserLink:link:hover, .colorChooserLink:visited:hover { border: 0; } table.head { width: 100%; font-family: sans-serif; text-align: left; } td.head { font-weight: bold; font-size: 1.5em; font-family: arial, sans-serif; } .menu { background-image: url(menu.gif); font-weight: normal; font-size: 1.25em; width: 100%; } .menuStandard { background-image: url(menuButton.gif); width: 109px; height: 21px; background-repeat: no-repeat; text-align: center; } .menuSelected { background-image: url(menuButton.gif); width: 109px; height: 21px; background-repeat: no-repeat; text-align: center; } .menuIndent { color: #FFFFFF; background-color: #7988a5; padding: 0; margin: 0; width: 0; } .menuSpacer { padding: 0; margin: 0; width: 0; } .rowOdd { color: #FFFFFF; background-color: #545F74; } .rowOdd td { border-top: 1px #888888 solid; border-bottom: 1px #888888 solid; } .rowEven, .rowEven :link, .rowEven :visited { color: #BBBBBB; background-color: transparent; } .rowHighlighted { color: #EEEEEE; background-color: #545f74; } .openMessageTable, .lookupResultsTable { border: 1px solid #888888; color: #FFFFFF; background-color: #545F74; } .openMessageCloser { text-align: right; } .openMessageBody { font-size: 1.2em; text-align: left; } td.accuracy0to49 { color: black; background-color: red; } td.accuracy50to93 { color: black; background-color: yellow; } td.accuracy94to100 { color: black; background-color: green; } div.error01 { font-size: larger; color: red; background-color: transparent; } div.error02 { color: red; background-color: transparent; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabelSort { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .logo2menuSpace { height: 1em; } .settingsTable, .settingsPanel { border: 1px solid #888888; color: #FFFFFF; background-color: #545F74; } .footer { background-image: url(menu.gif); margin-top: 10px; margin-left: 8%; margin-right: 8%; height: 22px; width: 84%; font-size: 0.9em; background-color: transparent; color: #000000; } .historyNavigatorTop, .historyNavigatorBottom { text-align: right; } .lineImg { width: 4px; } .colorChooserTable td { border: 0; } table.footer br { display: none; } .bottomLink { margin: 1em; } .bottomLink img { display: none; } tr.rowBoundary { background-color: #888888; } div.helpMessage { background-color: #545F74; border: 1px solid #888888; padding: 0.4em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } div.historySearchFilterActive { color: black; background-image: url(menu.gif); }popfile-1.1.3+dfsg/skins/sleet-rtl/right.gif0000664000175000017500000000147711624177326020235 0ustar danieldanielGIF89aBBRkk{т伯懸粕・惧ュ・・ュュュスオオニススニニニヨホニヨヨヨ゙!,`A (Hチ 0@@;popfile-1.1.3+dfsg/skins/sleet-rtl/menuButton.gif0000664000175000017500000000261511624177326021253 0ustar danieldanielGIF89am)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,mHーっ*\ネー。テ廩ア 3jワネア」ヌ CぎPア、タ Pィ\ノイ・ヒ0cハ廬s&q鞋Y + Jエィム」H*]ェ5v腆u5*畑ノオォラッ^KTィaオ*;ミタa!Dp飜扛キョンサxン[";メヨ巣ーF森フクア翩#K朖ケイ蠻#"リ0#マ:cD0「エ鰌ィSォ^ヘコオラーKC'7pリQ。テ゚タ Nシク翳+゙。剤6tローq#ニイk゚ホスサ狹O~;1ヲ゚リ]」 6p楼ソセ゚マソソ4C{4ヤテ{4タミ@4鞨F(痲Vh痳>連0フ` ニ滷d`竕(ヲィ竓,カ鞣0ニ遺 ク"0ト Ppチ宗)苣Di苟H&ゥd,滷傘ツ -, チXfゥ蝟\v鱧輿)譏ZJー@ Sセ狡.エ青 @ 逵tヨi逹x讖迸|Ig 、タf-ー爬 0陲6陬色*鬢之ハh&、ミツヲ,ィPィ * 埖ィ、頬ゥィヲェェャカェゥl&ィ`隰棣j茗ョシッタ+ートZ@ャ*h嘯 "仟ャ" エヤVkオリfォカワvK-エヘ[婆ケ隕ォコカサ訪I 0タス讚セソ,ー%;popfile-1.1.3+dfsg/skins/sleet-rtl/menu.gif0000664000175000017500000000147411624177326020061 0ustar danieldanielGIF89assъ券血恃櫨惧ュ・・ュ・・オュュスオオニススニニスホニニヨホニヨホホヨヨヨ゙゙ヨ!,d瘁 $@p@ 0 ;popfile-1.1.3+dfsg/skins/sleet-rtl/left.gif0000664000175000017500000000150111624177326020036 0ustar danieldanielGIF89a)!!1))911J99R9BZBJkJRsRZ{Zc慶k婆s徭{ュ{┠{舷釆!,H !0X A 0 ;popfile-1.1.3+dfsg/skins/sleet-rtl/button2.gif0000664000175000017500000000147711624177326020515 0ustar danieldanielGIF89a)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,+@アナ #>x牴!テ $@`タ;popfile-1.1.3+dfsg/skins/sleet-rtl/button.gif0000664000175000017500000000233711624177326020427 0ustar danieldanielGIF89ac)!)!!1))9)19)1B11B11J19B19J99J99R9BR9BZBBRBJRBJcBJkJRkJRsJZsRZ{RcЩc慶k把s把s很k{ks徭{ュs┠{{鶏┠{舷т売券釆血伯懸粕・惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,cX。チ*\ネー。テJ$「「ナ3jワネア」ヌ+L、阿、ノ(Sェ\ノイ・ヒ.A枇8sワノウァマ檗 鰍トJタ\ハエゥモヲ%fー「ト沖Xウjンハオォラッ`テ-ツぢ#Hィ]ヒカュロキp飜扛キョレホ~チキッ゚ソ Lクー眦|?莚ミ痺翩#K朖ケイ衢3CPCMコエ鰌ィSォ^-堙8ネ朞サカロクs゙ヘサ7 dリ@シク翳+_ホシケ酥3ソ寸コリウk゚ホスサ牘ス_hーツ勒ォ_マセス耆OOaチ ゚マソソ(烙'± @烽 6鞨F(痲Vネ y$タタv鞦 (竏$防b 搬,カ鞣0ニ(繻4ヨh繼タ<鞳宗)苣Did dタ鱈6鱠撤F)蜚TViePタ暴v鱧輿)譏d吠譁L$タlカ鱶孅ニ)逵tヨi逹 ;popfile-1.1.3+dfsg/skins/sleet-rtl/bottomRight.gif0000664000175000017500000000205111624177326021407 0ustar danieldanielGIF89aBBRkk{ssт売券血伯懸粕・惧ュ・・ュ・・オュュスオオニススニニスホニニヨホニヨホホヨヨヨ゙゙ヨ!,ツ  8hミ≠  @@@P A。 (@ ア@ナ、\畫B BD`「ナ pトノQ!テ"I0ySツA」Gzゥ`、D"H 母ヤ.9萍ッ*W.lリT(TミェMヒ&SョD4XHwョンアZ扼<ルー/ソeF4、眦呟*イアヌ-y2チテヒ3c~ネjトマ@卒E暢Sォ^]艨^ヌ-サ6mル'c]カn゙` ユdヘO~|「r「K櫻スztイk゚ホスv呉テOc@;popfile-1.1.3+dfsg/skins/sleet-rtl/bottomLeft.gif0000664000175000017500000000230211624177326021223 0ustar danieldanielGIF89a!!)!)!!)!!1!)1!)9))9)19)1B11B11J19B19J19R99J99R9BR9BZBBRBBZBJRBJcBJkBRkJRkJRsJZsRZ{RcЩZcZcЩc兄k慶k把s把s很k{ks很{・ssг{・s{ュs┠{{鶏┠{舷т売券犯釆血恃櫨惧・惧ュ・・オュ・オュュオオュスオオススオニススニニニホホニヨホホヨヨヨ゙゙ヨ!,9ワミqテ,R 「 (HPエ!ニ (H畏チd $芦"F v\。b。0Xpaナ 9謄G&F,y4nミ漾d薗「3k棄醒、┤0lリチツテ$X&]jツ/:ホ績Cエezヤzsテ%Xシ8x Dクカテ%Tャ`1ケイ Bメメエ2H(@.Q!f、JA(a「ョc利D3_#H葷Mすメ >N猶ADq"@ !Bヘュ;?azヤ5Hxョ蕨ヘ4d?^R@;popfile-1.1.3+dfsg/skins/sleet-rtl/bottom.gif0000664000175000017500000000147611624177326020423 0ustar danieldanielGIF89aBBRssъ券血恃櫨惧ュ・・オュュスオオニススニニニヨホニヨヨヨ゙!,Xミ $@pタ @`@;popfile-1.1.3+dfsg/skins/simplyblue/0000775000175000017500000000000011710356074016665 5ustar danieldanielpopfile-1.1.3+dfsg/skins/simplyblue/style.css0000664000175000017500000001103611624177324020543 0ustar danieldaniel/*********************************************************/ /* Main Body */ body { color: #000000; background-color: #ffffff; font-family: sans-serif; font-size: 100%; } /*********************************************************/ /* General element settings */ hr { color: #88b5dd; background-color: transparent; } a:link { color: #000000; background-color: transparent; text-decoration: underline; } a:visited { color: #333333; background-color: transparent; text-decoration: underline; } a:hover { color: #000000; background-color: transparent; text-decoration: none; } /*********************************************************/ /* Shell structure */ .shell, .shellTop { color: #000000; background-color: #bcd5ea; border: 2px #ffffff groove; margin: 0; } table.head { width: 100%; } td.head { font-weight: normal; font-size: 1.8em; } table.footer { width: 100%; } td.footerBody { width:33%; text-align: center; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.8em; } /*********************************************************/ /* Menu Settings */ .menu { font-size: 1.2em; font-weight: bold; width: 100%; } .menuSelected { color: #000000; background-color: #88b5dd; width: 14%; border-color: #ffffff; border-style: groove groove none groove; border-width: 2px; } .menuStandard { color: #000000; background-color: #bcd5ea; width: 14%; border-color: #ffffff; border-style: groove groove none groove; border-width: 2px; } .menuIndent { width: 8%; } .menuLink { display: block; width: 100%; } /*********************************************************/ /* Table Settings */ table.settingsTable { border: 1px solid #88b5dd; } td.settingsPanel { border: 1px solid #88b5dd; } table.openMessageTable { border: 3px solid #88b5dd; } td.openMessageBody { text-align: left; } td.openMessageCloser { text-align: right; } tr.rowEven { color: #000000; background-color: #bcd5ea; } tr.rowOdd { color: #000000; background-color: #88b5dd; } tr.rowHighlighted { color: #eeeeee; background-color: #29abff; } tr.rowBoundary { background-color: #88b5dd; } table.lookupResultsTable { border: 3px solid #88b5dd; } /*********************************************************/ /* Graphics */ td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } span.graphFont { font-size: x-small; } /*********************************************************/ /* Messages */ div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } div.helpMessage { background-color: #88b5dd; border: 2px #ffffff groove; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; font-weight: bold; } th.historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .bucketsWidgetStateOn, .bucketsWidgetStateOff { font-weight: bold; } .configWidgetStateOn, .configWidgetStateOff { font-weight: bold; } .securityWidgetStateOn, .securityWidgetStateOff { font-weight: bold; } /*********************************************************/ /* Positioning */ table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } .magnetsTable caption { text-align: left; } h2.history, h2.buckets, h2.magnets, h2.users { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #88b5dd; } popfile-1.1.3+dfsg/skins/outlook/0000775000175000017500000000000011710356074016174 5ustar danieldanielpopfile-1.1.3+dfsg/skins/outlook/style.css0000664000175000017500000001320411624177324020051 0ustar danieldanielbody { background-color: #FFFFFF; border: none; font-family: verdana, arial, sans-serif; color: black; font-size: 12pt; margin: 10px 20px 20px 20px; } .shell, .shellTop { color: #808080; background-color: #D4D0C8; border-style: groove; border-color: #FFFFFF; border-width: 2px; margin: 0px 0px 0px 0px; } input, select, textarea { color: #000000; background-color: #F2F0F0; border: 1px #000000 solid; font-weight: bold; font-family: verdana, arial, serif; } .checkbox { border: 0; //background-color: transparent; /* ie hack */ } .menu { font-size: 12pt; font-weight: bold; width: 100%; } .menuSelected { background-color: #7495C5; width: 14%; border-color: #FFFFFF; border-style: groove groove none groove; border-width: 2px; color: black; } .menuStandard { background-color: #D4D0C8; width: 14%; border-color: #FFFFFF; border-style: groove groove none groove; border-width: 2px; color: black; } .rowEven { background-color: #C6CBD2; border: 1px #000000 solid; color: black; } .rowOdd { background-color: #D9DEE7; border: 1px #000000 solid; color: black; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } h2 { font-family: verdana, arial, sans-serif; font-size: 12pt; font-weight: bold; color: #000000; background-color: transparent; } td { font-family: verdana, arial, serif; font-size: 10pt; } b { font-family: verdana, arial, serif; font-size: 10pt; font-weight: bold; color: #000000; background-color: transparent; } table.settingsTable { border: 1px solid Black; } table.openMessageTable, table.lookupResultsTable { border: 3px solid Black; } td.settingsPanel { border: 1px solid Black; } td.naked { padding: 0px; margin: 0px; border: none; } td.logo2menuSpace { height: 0.8em; } td.head { font-weight: bold; font-size: 10pt; } table.head { width: 100%; color: #808080; font-size: 12pt; font-family: verdana, arial, sans-serif; font-weight: bold; background: #ffffff; border-style: groove; border-color: #FFFFFF; border-width: 2px; margin: 0px 0px 0px 0px; } a.shutdownLink { font-size: 9pt; font-weight: bold; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } table.footer { width: 100%; color: #808080; background-color: #D4D0C8; border-style: groove; border-color: #FFFFFF; border-width: 2px; margin: 1em 0px 0px 0px; } td.openMessageCloser { text-align: right; } .menuIndent { width: 8%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; } td.historyNavigatorBottom { text-align: right; } tr.rowHighlighted { background-color: #000000; color: #eeeeee; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } tr.rowBoundary { background-color: #808080; } /*********************************************************/ /* Shell structure */ .shellStatusMessage { color: #000000; background-color: #EDEDCA; border: 3px #CCCC99 solid; width: 100%; } .shellErrorMessage { color: #FF0000; background-color: #EDEDCA; border: 3px #CCCC99 solid; width: 100%; } /*********************************************************/ /* Menu Settings */ .menuLink { display: block; width: 100%; } /*********************************************************/ /* Messages */ div.helpMessage { color: black; background-color: #C6CBD2; border: 2px groove #FFFFFF; padding: 0.3em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .search { display: inline; float: left; padding-right: 1em; } .filter { display: inline; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #F2F0F0; } popfile-1.1.3+dfsg/skins/osx/0000775000175000017500000000000011710356074015311 5ustar danieldanielpopfile-1.1.3+dfsg/skins/osx/style.css0000664000175000017500000001104311624177324017165 0ustar danieldaniel/* osx designed by Neil Lee (http://www.beatnikpad.com/) */ body { font-family: "Lucida Grande", "trebuchet ms", verdana, sans-serif; background-color: #e9e9e9; margin: 1%; } p, td { font-family: "Lucida Grande", "trebuchet ms", verdana, sans-serif; font-size: 11px; } h1, h2, h3 { font-size: 1.2em; font-family: "Lucida Grande", "trebuchet ms", verdana, sans-serif; } h2 { font-size: 1.5em; font-weight: bold; text-transform: capitalize; } a:link, a:visited { color: #4682b4; background-color: transparent; } a:hover { text-decoration: underline; } a:active { background-color: #4682b4; color: #fff; } input, select, textarea { color: black; background-color: #f1faff; border: 1px #5c738a solid; font-weight: normal; } input, select { font-size: 0.9em; } .submit, .toggleOn, .toggleOff, .undoButton, .deleteButton, .reclassifyButton { font-family: "Lucida Grande", "trebuchet ms", verdana, sans-serif; color: white; padding: 2px; font-weight: bold; background-color: #036; } .checkbox { border: 0; background-color: transparent; } .shell, .shellTop { background-color: #ffffff; border: 1px black dotted; width: 100%; color: black; } table.head { letter-spacing: 0.4em; text-transform: capitalize; font-size: 14px; width: 100%; font-weight: bold; } table.head a { font-size: 0.9em; text-decoration: none; letter-spacing: 0.0em; } .menu { font-size: 0.9em; font-weight: bold; margin: auto; text-align: center; width: 75%; } .menuLink { color: #333; text-decoration: none; background-color: transparent; display: block; width: 100%; } .menuSelected { width: 16%; height: 2em; font-weight: bold; background-color: white; border: 1px dotted #333; border-bottom: 0; } .menuStandard { width: 16%; height: 2em; background-color: #A6C4D8; border: 1px solid #666; border-bottom: 0; } .main { font-size: 0.9em; } .content { font-size: 0.9em; font-weight: normal; } .content th { font-size: 0.9em; font-weight: bold; } .rowEven { background-color: #fff; color: #4682b4; } .rowOdd { background-color: #f5f5f5; color: #4682b4; } table.footer { background-color: white; border: 1px #333 dotted; color: black; width: 100%; margin-top: 1em; } table.settingsTable { border: 1px dotted #e9e9e9; } table.openMessageTable, table.lookupResultsTable { border: 1px solid #6B76A1; } td.settingsPanel { border: 1px solid #d9d9d9; } td.naked { padding: 0; margin: 0; border: 0; } td.openMessageCloser { text-align: right; } .menuIndent { width: 0; padding: 0; margin: 0; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .bucketsLabel, .magnetsLabel, .securityLabel, .configurationLabel, .advancedLabel, .passwordLabel, .sessionLabel { font-weight: bold; } .historyLabel em { font-weight: bold; font-style: normal; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop, td.historyNavigatorBottom { text-align: right; } tr.rowHighlighted { background-color: #000000; color: #eeeeee; } td.logo2menuSpace { height: 0.8em; } a.changeSettingLink { background-color: transparent; color: #aabbcc; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } span.bucketsWidgetState, span.configWidgetState, span.securityWidgetState { font-weight: bold; } .historyLabel { font-weight: bold; } .historyLabel em { font-weight: bold; font-style: normal; } /* rowBoundary needs some IE and Opera hacks */ tr.rowBoundary td { border-top: 1px dotted #999; background-color: #ddd; //border: 0; } tr.rowBoundary { //background-color: #ddd; //height: 1px; } div.helpMessage { background-color: #f5f5f5; border: 1px dotted #999; padding: 0.4em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #A6C4D8; } popfile-1.1.3+dfsg/skins/orange/0000775000175000017500000000000011710356074015753 5ustar danieldanielpopfile-1.1.3+dfsg/skins/orange/style.css0000664000175000017500000001003411624177324017626 0ustar danieldaniel/*********************************************************/ /* Main Body */ body { color: #000000; background-color: #FFFFFF; font-family: sans-serif; font-size: 100%; } /*********************************************************/ /* Shell structure */ .shell, .shellTop { color: #000000; background-color: #ffffcc; border: 3px #ff9966 solid; } .shellStatusMessage { color: #000000; background-color: #ffffcc; border: 3px #ff9966 solid; width: 100%; } .shellErrorMessage { color: #FF0000; background-color: #ffffcc; border: 3px #ff9966 solid; width: 100%; } table.head { width: 100%; } td.head { font-weight: normal; font-size: 1.8em; } table.footer { width: 100%; } td.footerBody { text-align: center; width: 33%; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.8em; } /*********************************************************/ /* Menu Settings */ .menu { font-size: 1.2em; font-weight: bold; width: 100%; } .menuSelected { color: #000000; background-color: #ff9966; width: 14%; } .menuStandard { color: #000000; background-color: #ffcc99; width: 14%; } .menuIndent { width: 8%; } .menuLink { display: block; width: 100%; } /*********************************************************/ /* Table Settings */ table.settingsTable { border: 1px solid #ff9966; } td.settingsPanel { border: 1px solid #ff9966; } table.openMessageTable { border: 3px solid #ff9966; } td.openMessageBody { text-align: left; } td.openMessageCloser { text-align: right; } tr.rowEven { color: #000000; background-color: #ffffcc; } tr.rowOdd { color: #000000; background-color: #ffcc99; } tr.rowHighlighted { color: #000000; background-color: #ff9966; } tr.rowBoundary { background-color: #ff9966; } table.lookupResultsTable { border: 3px solid #ff9966; } /*********************************************************/ /* Graphics */ span.graphFont { font-size: x-small; } /*********************************************************/ /* Messages */ div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } div.helpMessage { background-color: #ffcc99; border: 2px solid #ff9966; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; font-weight: normal; } .historyLabelSort { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .bucketsWidgetStateOn, .bucketsWidgetStateOff { font-weight: bold; } .configWidgetStateOn, .configWidgetStateOff { font-weight: bold; } .securityWidgetStateOn, .securityWidgetStateOff { font-weight: bold; } /*********************************************************/ /* Positioning */ table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } .magnetsTable caption { text-align: left; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .search { display: inline; float: left; padding-right: 1em; } .filter { display: inline; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #ffcc99; } popfile-1.1.3+dfsg/skins/orangecream/0000775000175000017500000000000011710356074016763 5ustar danieldanielpopfile-1.1.3+dfsg/skins/orangecream/style.css0000664000175000017500000002102111624177324020634 0ustar danieldanielbody { background-color: #FFFFFF; border: none; font-family: sans-serif; color: black; font-size: 1em; } .shell { background-color: #ffffd0; border: 3px #ff9966 solid; color: black; } .shellTop { background-color: #ffffd0; border: 3px #ff9966 solid; color: black; width: 90%; } table.head { background: #ffffd0; width: 100%; color: #986343; } td.head { font-weight: bold; font-size: 0.9em; } .menu { font-size: 0.85em; font-weight: bold; width: 100%; } .menuIndent { width: 14%; } .menuSelected { background-color: #ffffd0; color: #1122bb; width: 12%; font-size: 1em; border-top: 3px #ff9966 solid; border-left: 3px #ff9966 solid; border-right: 3px #ff9966 solid; } .menuStandard { background-color: #FAE1C8; color: #1122bb; width: 12%; font-size: 1em; border-color: #F9E1C8; border-style: solid solid none solid; border-width: 3px; } .menuStandard .menuLink { text-decoration: none; background-color : transparent; color: #7E82A9; } .menuSelected .menuLink { text-decoration: none; background-color : transparent; color: #E80000; } a.menuLink:hover { background-color : transparent; color: #E80000; text-decoration: none; } tr.rowEven { background-color: #FFFFd0; color: black; font-size: 0.8em; } tr.rowOdd { background-color: #ffcc99; color: black; font-size: 0.8em; } tr.rowHighlighted { background-color: #ff9966; } hr { color: #ffcc99; background-color: #ffcc99; border: 0; } table.settingsTable { border: 1px solid #ffcc99; } table.openMessageTable, table.lookupResultsTable { border: 3px solid #ffcc99; } td.settingsPanel { border: 1px solid #ffcc99; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.footerBody { text-align: center; padding-top: 0.8em; font-size: 0.75em%; margin: auto; } td.naked { padding: 0; margin: 0; border: 0; } table.footer { width: 100%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: 0.5em; } .historyLabel { background-color: transparent; color: #754B4B; font-size: 0.75em; font-weight: bold; text-align: center; } .historyLabel a{ text-decoration: none; color: #754B4B; background-color: transparent; } .historyLabel a:hover { background-color: transparent; color: #cc1144; } .historyLabel em { font-style: normal; background-color: transparent; color: #cc1144; } .bucketsWidgetStateOn { font-weight: bold; background-color: transparent; color: #434fa0; font-size: 90%; } .bucketsWidgetStateOff { font-weight: bold; background-color: transparent; color: #434fa0; font-size: 90%; } .bucketsLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; text-align: center; } .magnetsLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; } .securityLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; } .configurationLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; text-align: left; } .advancedLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; } .passwordLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; } .sessionLabel { background-color: transparent; color: #5E3C2F; font-weight: bold; font-size: 75%; } td.logo2menuSpace { height: 0.8em; } a.messageLink { background-color : transparent; color: #3172b0; } a.messageLink:hover { background-color : transparent; color: #cc5566; } a.shutdownLink, a.logoutLink { background-color: transparent; color: #775555; text-decoration: none; font-size: 70%; font-weight: bold; } a.shutdownLink:hover, a.logoutLink:hover { background-color: transparent; color: #dd0000; text-decoration: none; } a.bottomLink { text-decoration: none; color: #000088; background-color: transparent; } a.bottomLink:hover { background-color: transparent; color: #cc1144; text-decoration: none; } h2.password { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.session { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.history { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.buckets { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.magnets { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.configuration { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } h2.security { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } div.bucketsMaintenanceWidget { padding-left: 5%; } div.bucketsLookupWidget { padding-left: 5%; } div.magnetsNewWidget { padding-left: 5%; } span.securityWidgetStateOn { color: #298841; background-color: transparent; margin-left: 1em; font-weight: bold; font-size: 75%; } span.securityWidgetStateOff { color: #298841; background-color: transparent; margin-left: 1em; font-weight: bold; font-size: 75%; } div.securityExplanation { margin-left: 0.8em; margin-right: 0.7em; margin-bottom: 0.8em; margin-top: 1.0em; font-size: 75%; } h2.advanced { color: #3c4895; background-color: transparent; font-size: 82%; font-weight: bold; } .advancedAlphabet { color: #309040; background-color: transparent; font-size: 90%; padding-left: 0.6em; } .advancedAlphabetGroupSpacing { color: #309040; background-color: transparent; font-size: 90%; padding-left: 0.6em; padding-top: 1.0em; } .advancedWords { padding-left: 0.6em; font-size: 80% ; } .advancedWordsGroupSpacing { padding-left: 0.6em; padding-top: 1.2em; font-size: 80% ; } .advancedGroupSpacing { height: 2.5em; vertical-align: text-bottom; padding-top: 1em; } div.advancedWidgets { padding-left: 36%; padding-bottom: 1.0em; } .historyWidgetsTop { width: 100%; padding: 0; margin-top: 0; margin-bottom: 1.0em; } .historyWidgetsBottom { width: 100%; margin-left: 1.5em; margin-top: 1.0em; } td.historyNavigatorTop { text-align: right; padding-right: 0.5em; } td.historyNavigatorBottom { text-align: right; padding-right: 0.5em; padding-bottom: 1.0em; } .lineImg { width: 0.1em; } .colorChooserImg { width: 0.3em; } .submit { font-size: 0.7em; } input { font-size: 0.7em; } select { font-size: 0.7em; } .reclassifyButton { font-size: 0.7em; } .configWidgetStateOn { color: #298841; background-color: transparent; font-weight: bold; font-size: 75%; } .configWidgetStateOff { color: #298841; background-color: transparent; font-weight: bold; font-size: 75%; } .magnetsTable caption { font-size: 85%; width: 100%; text-align: left; margin-bottom: 1.0em; } tr.rowBoundary { background-color: #ff9966; } /*********************************************************/ /* Menu Settings */ .menuLink { display: block; width: 100%; } /*********************************************************/ /* Messages */ div.helpMessage { background-color: #ffcc99; border: 2px solid #ff9966; padding: 0.3em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ .historyLabel { text-align: left; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } h2.history { margin-top: 0; margin-bottom: 0.1em; } .search { display: inline; float: left; padding-right: 1em; } .filter { display: inline; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #FAE1C8; } popfile-1.1.3+dfsg/skins/ocean/0000775000175000017500000000000011710356074015565 5ustar danieldanielpopfile-1.1.3+dfsg/skins/ocean/view-page.thtml0000664000175000017500000001673111624177324020536 0ustar danieldaniel

">
">
" /> " /> " /> " /> " /> " />
:
:
:
:
:
: ">
">
" value=""> : : " />

&session=&text=1"> ">
popfile-1.1.3+dfsg/skins/ocean/style.css0000664000175000017500000000622211624177324017444 0ustar danieldanielbody { background-color: #adcbd1; color: black; z-index: 2; padding: 0 2px; margin: 0; font-size: 0.9em; font-family: "trebuchet ms", tahoma, sans-serif; } a:link, a:visited, a:hover, a:active { text-decoration: none; } ul.menu { list-style-type: none; padding: 0; margin: 0; } ul.menu li { float: left; width: auto; } ul.menu li a:link, ul.menu li a:visited, ul.menu li a:hover, ul.menu li a:active { padding: 0 20px; display: block; margin: 2px; } #navigation { position: relative; top: 5px; left: 0; width: 100%; z-index: 1; } body > #navigation { position: fixed; } #navigation ul.menu li.shutdownLink { float: right; margin-right: 4px; } #navigation a:link, #navigation a:visited, #navigation a:active { padding: 10px 10px; margin: 0 0 0 3px; font-size: 1.2em; line-height: 1.2em; color: black; color: #367D8A; } .menuStandard a:link, .menuStandard a:visited { border: 2px solid gray; background-color: #d7d4cc; } .menuSelected a:link, .menuSelected a:visited { border: 2px solid white; background-color: #d7d4cc; } .shutdownLink a:link, .shutdownLink a:visited { border: 2px solid #be6060; background-color: #d7d4cc; color: #c82c2c !important; } #navigation a:hover { border: 2px solid #e0e0e0; background-color: #eaa; } #content { position: relative; top: 4em; left: 1%; width: 98%; } #shell { border: 3px solid #777; background-color: #e0e0e0; width: 98%; padding: 1%; } .toggleOff { border-top: 2px groove #404040; border-left: 2px groove #404040; border-right: 1px solid white; border-bottom: 1px solid white; } .toggleOn { border-top: 1px solid white; border-left: 1px solid white; border-right: 2px ridge #404040; border-bottom: 2px ridge #404040; } .rowEven { background-color: #e0e0e0; } .rowOdd { background-color: #d5d5d5; } .rowEven:hover, .rowOdd:hover { background-color: #eeecec; } .rowBoundary { background-color: InfoBackground; } .historyNavigatorTop, .historyNavigatorBottom, .openMessageCloser { text-align: right; } .settingsPanel { border: 2px groove white; padding: 5px; width: auto; } .settingsTable { border-spacing: 5px; width: 100%; } th { text-align: left; } .bucketsLabel { text-align: center; } #footer { width: 96%; left: 2%; padding: 40px 0; font-size: 0.9em; text-align: center; } #footer p { margin: 0; padding: 0; } #footer a { display: inline; padding: 0 20px; } .messageHeaders td + td { padding-left: 20px; } .top20Words { font-family: "Andale mono", "Courier new", monospace; } .messageHeaders td { font-size: 1.2em; vertical-align: top; } .helpMessage { font-size: 1.1em; background-color: #f0f0f0; color: black; padding: 20px; border: 2px dashed red; } div.helpMessage form { margin: 0; } input { font-size: 1em; } .advancedAlphabet, .advancedAlphabetGroupSpacing { vertical-align: top; } .date { white-space: nowrap; font-size: 0.8em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #eaa; } popfile-1.1.3+dfsg/skins/ocean/history-page.thtml0000664000175000017500000003046111624177324021261 0ustar danieldaniel



" /> " />


" /> " />
" /> " /> " /> " /> " /> " />

()

" />
(">)

()

" />
(">)
">
" /> " /> " /> " /> " /> " /> ">
&setsort="> " />
">
" class="checkbox" name="remove_"/> " name="rowid_" value=""/> "> "> "> "> " href="/view?view="> "> "> &showbucket="> "> " value="" />
" alt="" src="/skins/default/magnet.png">
  ">
">
">
" /> " /> ()" />
" />
"> : " /> " /> " />



. . .

popfile-1.1.3+dfsg/skins/ocean/common-middle.thtml0000664000175000017500000000323711624177324021373 0ustar danieldaniel" onLoad="OnLoadHandler()">
popfile-1.1.3+dfsg/skins/ocean/common-bottom.thtml0000664000175000017500000000343211624177324021436 0ustar danieldaniel
popfile-1.1.3+dfsg/skins/oceanblue/0000775000175000017500000000000011710356074016435 5ustar danieldanielpopfile-1.1.3+dfsg/skins/oceanblue/style.css0000664000175000017500000001411411624177324020313 0ustar danieldaniel/* OceanBlue by Joseph Connors (texasfett) Some useful sites other skinners may want to visit: Menu as list items (design and colors for this skin are based one of the examples): http://www.alistapart.com/articles/taminglists/ Float layout from: http://www.ryanbrill.com/floats.htm Workaround ie bug when using floats: http://www.positioniseverything.net/explorer/peekaboo.html Hack to fix ie float bug: http://www.positioniseverything.net/articles/hollyhack.html#haslayout */ body { background-color: darkblue; font-family: 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; margin: 0; padding: 0; font-size: 0.8em; width: auto; color: white; } .shell { font-size: 1em; border: 1px solid #90bade; background-color: #508fc4; text-align: left; padding: 0.5em; margin: 0; margin-left: 8.6em; width: auto; } .shellTop { width: 100%; padding: 0; margin: 0; border: 0; border-collapse: collapse; margin-bottom: 0.25em; } .shellLeft, .shellRight, .shellTopRow, .shellTopLeft, .shellTopCenter, .shellTopRight, .shellBottomRow, .shellBottomLeft, .shellBottomRight { display: none; } .naked { font-size: 1em; color: white; background-color: transparent; font-weight: normal; padding: 0; margin: 0; border: 0; } input, select, textarea, .submit { border: 1px solid white; color: white; background-color: #2175bc; } input:hover, select:hover, textarea:hover { background-color: #1165ac; } .submit:hover { background-color: #2586d7; } input { font-size: 1em; } .checkbox { background: transparent; border: 0; } form { margin: 0; } table.head { color: white; font-weight: bold; background-color: #2175bc; border: 1px solid #90bade; margin: 0; padding: 0; height: 1em; width: 100%; } .settingsTable { border: 1px solid #2175bc; border-right: 0; /* trick to get single line border in between Panels */ margin: 0; padding: 0; } .settingsTable + br { display: none; } .settingsPanel { color: white; border: 0; border-right: 1px solid #2175bc; padding: 5px; margin: 0; } hr { color: #2175bc; background-color: #2175bc; height: 1px; border: 0; } .headShutdown { text-align: right; font-size: 0.8em; font-weight: normal; } .headShutdown a:link, .headShutdown a:visited { text-decoration: none; color: white; } .headShutdown a:hover { color: red; text-decoration: none; } .menu { font-size: 1em; font-weight: normal; color: #333; background-color: #90bade; border: 1px solid #90bade; border-bottom: 0; padding: 0; margin: 0; width: 8.3em; float:left; } .menu ul { list-style: none; margin: 0; padding: 0; border: none; } .menu li { border-bottom: 1px solid #90bade; margin: 0; } .menu li a { display: block; padding: 5px 5px 5px 0.5em; border-left: 10px solid #1958b7; border-right: 10px solid #508fc4; background-color: #2175bc; color: #fff; text-decoration: none; width: 100%; } html>body .menu li a { width: auto; } .menu li a:hover { border-left: 10px solid #1c64d1; border-right: 10px solid #5ba3e0; background-color: #2586d7; color: #fff; } .menuSpacer { display: none; } .menuIndent { display: none; } .menuStandard a:hover, .menuSelected a:hover { text-decoration: none; color: white; } .menuStandard a:visited, .menuSelected a:visited { text-decoration: none; color: white; } h2 { color: white; font-weight: bold; font-size: 1.2em; } .rowEven { color: white; background-color: transparent; } .rowOdd { color: white; background-color: #2586d7; } .rowHighlighted { color: white; background-color: #5ba3e0; } .rowOdd:hover, .rowEven:hover { background-color: #5ba3e0; } .footer { font-size: 0.9em; background-color: lightblue; font-weight: normal; margin-top: 1em; width:100%; text-align: center; clear: both; padding: 0; } .footerBody { color: black; text-align: center; padding-top: 2px; padding-bottom: 2px; } .footer br { display: none; } .helpMessage a:link, .helpMessage a:visited, .footer a:link, .footer a:visited { color: darkblue; } .bottomLink { padding-left: 0.8em; padding-right: 0.8em; } .bottomLink img { display: none; } .historyNavigatorTop { text-align: right; padding-right: 0.5em; vertical-align: top; } .historyNavigatorBottom { text-align: right; padding-right: 0.5em; padding-bottom: 1em; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { padding-top: 0.3em; margin: 0; } .historyWidgetsTop { border-top: none; border-bottom: none; width: 100%; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .historyTable { border-top: none; border-bottom: none; width: 100%; } .historyLabel a:link, .historyLabel a:visited { color: white; } .historyLabelSort a:link, .historyLabelSort a:visited { color: white; text-decoration: none; } .openMessageTable, .lookupResultsTable { border: 0; } .openMessageCloser { text-align: right; font-size: larger; font-weight: bold; } .openMessageBody { color: black; font-size: 1.1em; text-align: left; } div.error01 { color: red; font-size: larger; } div.error02 { color: red; } div.securityExplanation { margin: 0.8em; margin-top: 0; font-size: 95%; } div.helpMessage { color: black; background-color: lightblue; border: 1px solid black; padding: 0.4em; } div.helpMessage form { margin: 0; } span.graphFont { font-size: 95%; } .rowBoundary { background-color: #2175bc; } .bucketsWidgetStateOn, .configWidgetStateOn, .securityWidgetStateOn { font-weight: bold; } a:link, a:visited { color: #EEEEFF; text-decoration: none; } a:link:hover, a:visited:hover { text-decoration: underline; } .footer ul { list-style: none; margin: 0; padding: 0.4em; } .footer li { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #5ba3e0; } popfile-1.1.3+dfsg/skins/oceanblue/ie6.css0000664000175000017500000000016611624177324017640 0ustar danieldaniel.menu { width: 6.3em; } /* Hide Tan Hack from IE5-mac \*/ * html .shell {height: 1%;} /* End hide from IE5-mac */ popfile-1.1.3+dfsg/skins/oceanblue/common-top.thtml0000664000175000017500000000101111624177324021573 0ustar danieldaniel "> <TMPL_VAR NAME="Localize_Header_Title"> style.css" title="POPFile"> popfile-1.1.3+dfsg/skins/oceanblue/common-middle.thtml0000664000175000017500000000672111624177324022244 0ustar danieldaniel" onLoad="OnLoadHandler()">
&mi=&bu=" /> &mc=&ec=" /> popfile-1.1.3+dfsg/skins/oceanblue/common-bottom.thtml0000664000175000017500000000350411624177324022306 0ustar danieldaniel
popfile-1.1.3+dfsg/skins/lavish/0000775000175000017500000000000011710356074015766 5ustar danieldanielpopfile-1.1.3+dfsg/skins/lavish/topRight.gif0000664000175000017500000000165711624177324020271 0ustar danieldanielGIF89a!!!)))1119999BBkkks{{ттъ血, Hー チ(Xネー。テ.路ア「ナ$リネア」ヌ Iイ、ノィ\ノイ%ヒbハ廬sfニ8sヤ2「マ檗& Jエ(「H}&タエゥモァOB:u)ユォLリハオォWッ ソォuャルュ ィ]ヒカm[n翦M+キョレ掘冢オ3ッ゙スq;popfile-1.1.3+dfsg/skins/lavish/topLeft.gif0000664000175000017500000000167011624177324020101 0ustar danieldanielGIF89a!!!)))1119999BBkkks{{ттъ血,Hーチ(\ネーaテ H廩ア"Ehワネア紮Iイ、H"ィ\ノイ%* ネ廬ウ&LrワケfN@ 黌ィQ「 (Hタ@」G@オェUゥャj・隔ォヨョU Kイdヘ「ォvlキレV.ンクI6} 4ャXコ2u:分ロキ;popfile-1.1.3+dfsg/skins/lavish/top.gif0000664000175000017500000000155011624177324017263 0ustar danieldanielGIF89a !!!)))1119999BBkkks{{ттъ血, M8pチ(\クPテH8ナ hワク1ヌIイ、IRェ\ノイeK0cハ廬吐○8sワケマ檗 ;popfile-1.1.3+dfsg/skins/lavish/style.css0000664000175000017500000001414611624177324017651 0ustar danieldaniel/* Lavish by Dan Martin (kraelen) */ body { padding: 0; margin-top: 5px; margin-bottom: 5px; margin-left: 3.5%; margin-right: 3.5%; color: #ffffff; font-family: sans-serif; background-color: #000000; } .shell, .shellTop { width: 100%; border-style: none; border-collapse: collapse; background-color: #000000; color: #ffffff; border-spacing: 0; } .shellTopLeft { background-image: url(topLeft.gif); background-repeat: no-repeat; padding: 0; margin: 0; height: 20px; border-style: none; } .shellTopRight { background-image: url(topRight.gif); background-repeat: no-repeat; padding: 0; margin: 0; border-style: none; height: 22px; } .shellTopCenter { background-image: url(top.gif); background-repeat: repeat-x; height: 20px; padding: 0; margin: 0; } .shellLeft { padding: 0; background-image: url(left.gif); margin: 0; width: 20px; border-style: none; background-repeat: repeat-y; } .shellRight { padding: 0; background-image: url(right.gif); margin: 0; width: 22px; border-style: none; background-repeat: repeat-y; } .shellBottomCenter { padding: 0; background-image: url(bottom.gif); margin: 0; border-style: none; background-repeat: repeat-x; height: 22px; } .shellBottomLeft { padding: 0; background-image: url(bottomLeft.gif); margin: 0; border-style: none; background-repeat: no-repeat; height: 22px; width: 20px; } .shellBottomRight { padding: 0; background-image: url(bottomRight.gif); margin: 0; border-style: none; background-repeat: no-repeat; height: 22px; width: 22px; } table.head { width: 100%; text-align: left; font-family: sans-serif; } td.head { font-weight: normal; font-size: 14pt; font-family: sans-serif; } .menu { font-weight: normal; font-size: 10pt; background-image: url(menu.gif); width: 100%; } .menuSelected, .menuStandard { width: 124px; } .menuIndent { padding: 0; margin: 0; width: 0; } tr.rowEven { font-size: 0.9em ; color: #FFFFFF; background-color: transparent; } tr.rowOdd { font-size: 0.9em ; color: #FFFFFF; background-color: #101010; } tr.rowHighlighted { color: #EEEEEE; background-color: transparent; } table.footer { width: 100%; padding-top: 1em; } table.settingsTable { border: #EFEFF7 1px solid; } table.openMessageTable, table.lookupResultsTable { border: #EFEFF7 3px solid; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: black 1px solid; } .naked { border: medium none; padding: 10px; font-size: 10pt; color: #FFFFFF; font-family: sans-serif; background-color: #181818; } td.accuracy0to49 { color: black; background-color: red; } td.accuracy50to93 { color: black; background-color: yellow; } td.accuracy94to100 { color: black; background-color: green; } div.error01 { font-size: larger; color: red; background-color: transparent; } div.error02 { color: red; background-color: transparent; } span.graphFont { font-size: x-small; } .historyLabel, .bucketsLabel, .magnetsLabel, .securityLabel { font-weight: bold; } .configurationLabel, .advancedLabel, .passwordLabel, .sessionLabel { font-weight: bold; } td.logo2menuSpace { height: 0.8em; } td.footerBody { font-size: 10pt; color: #FFFFFF; font-family: sans-serif; text-align: center; background-color: transparent; width: 33%; } table.historyWidgetsTop { margin-top: 0.6em; margin-bottom: 1em; margin-left: 1.5em; width: 100% } table.historyWidgetsBottom { margin-top: 0.6em; width: 100%; } td.historyNavigatorTop { text-align: right; } td.historyNavigatorBottom { text-align: right; } .menuSelected a { font-weight: bold; font-size: 10pt; color: #000000; background-color: transparent; } .menuStandard a { font-weight: bold; font-size: 10pt; color: #FFFFFF; background-color: transparent; } a { font-size: 10pt; color: white; background-color: transparent; } select, input, textarea { border-right: #FFFFFF 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; border-bottom: #FFFFFF 2px solid; color: #FFFFFF; background-color: #313131; } input.checkbox { background-color: transparent; } .submit, .toggleOn, .toggleOff, .undoButton, .deleteButton, .reclassifyButton { border-right: #000000 2px solid; border-top: #FFFFFF 2px solid; border-left: #FFFFFF 2px solid; border-bottom: #000000 2px solid; color: #FFFFFF; background-color: #313131; } hr { color: #EFEFF7; background-color: transparent; } a:link:hover, a:visited:hover { color: #000000; background-color: #EFEFF7; } .menuSelected a, .menuStandard a:hover { color: #000000; background-image: url(buttonSelected.gif); padding-left: 6px; } .menuStandard a, .menuSelected a:hover { color: #FFFFFF; background-image: url(buttonUnselected.gif); padding-left: 6px; } .menuSpacer { padding: 0; margin: 0; width: 0; } .historyLabel em { font-style: normal; } tr.rowBoundary { background-color: #050505; } /*********************************************************/ /* Menu Settings */ .menuLink { /* makes entire menu tab clickable */ display: block; width: 100%; } /*********************************************************/ /* Messages */ div.helpMessage { background-color: #101010; border: 1px solid #FFFFFF; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .refreshLink { // optional, link can be hidden margin-top: 0.5em; } h2.history { // optional margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { // spacing for top remove buttons (can be used to hide the top set of buttons) padding-bottom: 1em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { color: black; background-color: #EFEFF7; } popfile-1.1.3+dfsg/skins/lavish/right.gif0000664000175000017500000000153011624177324017574 0ustar danieldanielGIF89a!!!)))111999kkk,= Xネp! Dィー!テ 8( !ヤネム#H"%n、$ニ;V0 ;popfile-1.1.3+dfsg/skins/lavish/left.gif0000664000175000017500000000156711624177324017423 0ustar danieldanielGIF89a !!!)))1119999BBkkks{{ттъ血, \,` (タ逗テHミ BpHb Lクー眦款Xr翹)+柴ィ促G*-栂hイ#ハ:iシs衾/qハdノモ・O;popfile-1.1.3+dfsg/skins/lavish/buttonUnselected.gif0000664000175000017500000000451011624177324022007 0ustar danieldanielGIF89a|!)!!!!!!!)!!1)!))))))1))91)111111911B91991B99999B99JB9BBBBBBJBBRBJJBJRJJJJJRJJZJJcJRRRJRRJZRRRRRZRZZRZcZZcZcccZkccccckckkkcskkkkksksssssss{ssг{{s{к{кт{ът隙血血伯粕,|Hーチ*\ネー。テbE /jフネq」ヌ ? Ir、ノI\P逝7r陂ケcヲフ:dメエゥァホ愬+ュZxチ#ヌ^ 呷Xr萇!g柩咐fノ;SgムMo!#qC r2"Cr羸ュサwンシ゚ ワ7盪ュシ9r眸w价。。 /ホzンホスサ狹Oセ<テョHPbヤ耆欅ソセ}3JL`X8ワ 烙h焉&ィ烽 6リ 8タミ テ ,ーPツvリ! (竏$防" 「 ーシ %タA<ミタ8タ緕=ネ」:$織")苣Eルd巽苟L6I%鉄Jeh@ 6ミタLエi嬶ァ徠ツi掎譎逹s粳'掟ニ馮殕ェ遏 PーpX 茯タ・ 4iヲ.ゥヲ翌ヲ缶鬧」「夛ェ xz*ォヲェコjゥ\・B |ツ *┣A +ャ [ャーナ:ミ@イトォアヒ6ャウヌォタエメロ,イメ"ォャヲ;ろmエリB岶エ` チ 5シPc(>Fミcスヤ屮ヨ セ筬タタソ0セ /l0チ&\&pテ チHタA 'ツHcヒ8Jミイ2ラ後ヒミワフ5シウ9茎ヒ.ウヘDテワsホEャ3ミ4ラtムpーチ.D,フ0 膿 vb[ vュ佻rルgウ}fォ左レkヒカレjテ攜リuキスロq]+ンdモ=8゚m#ヨQ(テ /ィp2Pn蜚gホ9譁sチ喟Nzd z|室隗>z髻oセz螢゚コ扈dm/ト! tpーシ才+O濯フ?乗メロ霈モcソ|ユOソス罐 =躊}ヒGOセ;?け,Tタ ^CホネSツ綫'タミFD橙g@ッl (チNP◯デ1Hタ ッLA 8ー`状J ヤH5r!`(テ!@@癌w%b kT」ミ8ャムnXD羽 「z8テ覗5「" mD>相N茖Aタ籍 0÷f  。(xc畊8ニム+@ Pー=覯w臘8ヌ@bD%#!(H?ホ1(クH!Sノ<セ1宋、」%1GPR吹トミ B @*l*WノハUセ扮l・+UKYカ牟エ・,kノKV祿了,o飩x)%x0 8厰絹4ァIヘjZ壓フヲ6。 ケHH"クAn`蔆冤3m8tイ桃;9マtコウ搶{'7儖tヲp曁'> O潁$(昔熹メチ ネ) ヤ・A lpラ^肇舉E9*マワ」オ(FノyQ当I@(K1コム到エヲ25gE?jモ呎「>螽Jmムフ 0ワ`&O'Tヤ吭熹PUアjユェVユゥPス鶺ケ Vッ歯ォ8ミ浦ュ:ヨォ忌ォS}V。:$5`チ z`hu>ミA`}Pツ鵝ォ>ャ`Xトヨmャb ルナvイ,b'[Xー句hCKレトホ$ーmeYヨタ%3@ タエ河ュnwヒロ゙キタ ョpKヷ゙`I后{翰ワ:ケミ X ロ;popfile-1.1.3+dfsg/skins/lavish/buttonSelected.gif0000664000175000017500000000437211624177324021452 0ustar danieldanielGIF89a|!!!!!!!)!)))))111199999BBBBBJJJJJJRJRRRRRRRZRZZZZZZZcccccckkkkkkssssss{{{{{{к{隙тт隙伯血血伯懸粕粕莫粕・惧惧悋惧ュ・・・・・ュ・・オュュュュュオュュスオオオオオスオオニスススススニススホスニニニニニニニホニホホホホホホホヨヨヨヨヨヨ゙ヨ゙゙゙゙゙゙゙釵゙゙鉗鉗鉐,|Hーチ*\ネー。テ&ータ。トM搬クア#GM\ワ彫G A^L參cI"?コt)ウ覓 44p仟♂=|Jエィム」H*]ハエ餝,0ャテ"F!bUュ]サr嗽XーEク朞+Zオbロニ%广Yケlメヒk&ネ##G#A|б翦;慈Xr簓Y+?ヨ テ ,、`#楳"Xト@d修吶札h$;#丹貂$>R9・"X%鯖禀ム *@BZー<ヤミ 8qチnニ'徘ホノ◎uメyァ栞)ァ框i遐'揉ニiツ 8PC2カ纛惑ェ鬥忻鬧**ィ&、 &B, 9、 テ <嬉 フ:ォャ ネ*ョコ~尖ュセハ+ーソャュナklイヌ.ロ+ウミ ロ, )xBPPB 0/倭ePAFP cーツイLaUテ セ| 崖タ  Uィ ̄エ" ノ3≦,t#ハGLb(&R欝"揶E'B凱(ナ0bQ開ヤ「オxD p PDタタL5ィチ nヌ=殉」 IネB粋ト")H ア`z: f;リ2ノノNzイ9、(99。Q2幡%*S鯔Uヲイ[*! @YR(vワA2ノメ僚%にK`s佗%1)Lcメ區2)フ^駐ヤ<5」ゥL_窶$7 ワCAPヤ襖te<ツ;ル)タ到舁:K}ウ檍ト'@ 暼トgA9トィ8Aチ懍E/ハQKzt」({0 シ、アィIE*R汲t」襯ゥI7コR配t・%鎬Yシ `hーョ \χ!5ゥA鷏「コT・ △H]ェT頭U・R鮒9ェS ヨアnUゥCネjZ」*噴o*{ミユ楡@*ィ@ x0Uヲn蟇 ャ`KリツーMャbkノd(】KルハZイ=,dリ;popfile-1.1.3+dfsg/skins/lavish/bottomRight.gif0000664000175000017500000000163211624177324020764 0ustar danieldanielGIF89a!!!)))111999,  烙Xネpa Dィー!テ N瑞ナ5 8ネア簓"GRアJ$Kイ< ヲヘ-]ヨエIgヒ<{垓ー」ム」9]4タR、MsJ9uテェRッb`+Wッ4チ*ヨ!ニウhモェ]ヒ#;popfile-1.1.3+dfsg/skins/lavish/bottomLeft.gif0000664000175000017500000000167211624177324020605 0ustar danieldanielGIF89a!!!)))1119999BBkkks{{ттъ血, (Xチ(タpテ"Hミ B x繊 Lクー。テi租F (d9」ニ(gyア菷uVャgD4{セ鯰6a「t:T餉&uy5fヨュQ劼カ(VイO.5幹レウワv7ュUゥc裘mk零^エUォイー眦+^;popfile-1.1.3+dfsg/skins/lavish/bottom.gif0000664000175000017500000000151311624177324017764 0ustar danieldanielGIF89a!!!)))111999kkk,0 XAXネー。C"J廩Q窶3jトH」ヌ CIメcツ(;popfile-1.1.3+dfsg/skins/green/0000775000175000017500000000000011710356074015600 5ustar danieldanielpopfile-1.1.3+dfsg/skins/green/style.css0000664000175000017500000001034611624177324017461 0ustar danieldanielH1,H2,H3,P,TD { font-family: sans-serif; } body { background-color: #D7E9D9; font-family: arial, sans-serif; color: white; } a { color: white; background-color: transparent; } input, select, textarea, .submit { color: white; background-color: #7AAC80; border: 1px white solid; font-size: 8pt; font-weight: normal; } .shell, .shellTop { background-color: #7AAC80; border: 1px white solid; color: white; } table.head { font-weight: normal; font-size: 12pt; width: 100%; } table.head a { font-size: 10pt; width: 100%; } td.head { font-weight: normal; } .menu { font-size: 10pt; width: 100%; } .menuLink { color: white; background-color: transparent; } .menuSelected { background-color: #7AAC80; width: 12%; border: 1px white solid; height: 20px; color: white; } .menuStandard { background-color: #2A582F; width: 12%; border: 1px black solid; height: 20px; color: white; } .main { font-size: 12px; } h2 { font-size: 12pt; font-weight: bold; } .content { font-size: 10pt; font-weight: normal; } .content th { font-size: 10pt; font-weight: normal; } .rowEven { background-color: #2A582F; color: white; } .rowOdd { background-color: #3A8643; color: white; } table.footer { background-color: #7AAC80; border: 1px white solid; color: white; width: 100%; margin-top: 1em; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } table.settingsTable { border: 1px solid #2A582F; } table.openMessageTable, table.lookupResultsTable { border: 3px solid #2A582F; } td.settingsPanel { border: 1px solid #2A582F; } td.naked { padding: 0px; margin: 0px; border: none } td.openMessageCloser { text-align: right; } .menuIndent { width: 16%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; } td.historyNavigatorBottom { text-align: right; } tr.rowHighlighted { background-color: #000000; color: #eeeeee; } td.logo2menuSpace { height: 0.8em; } a.changeSettingLink { background-color: transparent; color: #0000cc; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } tr.rowBoundary { background-color: transparent; height: 0.3em; } /*********************************************************/ /* Menu Settings */ .menuLink { display: block; width: 100%; } /*********************************************************/ /* Messages */ div.helpMessage { background-color: #3A8643; border: 1px solid #2A582F; padding: 0.3em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .refreshLink { margin-top: 0.5em; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #3A8643; } popfile-1.1.3+dfsg/skins/glassblue/0000775000175000017500000000000011710356074016461 5ustar danieldanielpopfile-1.1.3+dfsg/skins/glassblue/style.css0000664000175000017500000001057611624177324020347 0ustar danieldanielH1,H2,H3,P,TD { font-family: sans-serif; } body { background-color: #999999; font-family: Verdana, sans-serif; color: white; margin: 1em; } a { color: white; background-color: transparent; } input, select, textarea, .submit { color: black; background-color: #C1C1C1; border: 1px white outset; font-size: 9pt; font-weight: normal; } input.checkbox { background-color: transparent; border: 0; } .shell, .shellTop { background-color: #344FB2; border: 1px black solid; width: 100%; color: white; } table.head { font-weight: normal; letter-spacing: 0.4em; text-transform: capitalize; font-size: 11pt; width: 100%; } table.head a { font-size: 9pt; text-decoration: none; letter-spacing: 0.0em; } .menu { font-size: 9pt; width: 100%; } .menuLink { color: white; text-decoration: none; background-color: transparent; } .menuSelected { background-color: #23367D; width: 12%; border: 1px black solid; border-bottom: 0; height: 20px; font-weight: bold; letter-spacing: 0.1em; color: white; } .menuStandard { background-color: #344FB2; width: 12%; border: 1px black solid; height: 20px; letter-spacing: 0.1em; color: white; } .main { font-size: 11px; } h2 { font-size: 11pt; font-weight: bold; text-transform: capitalize; } .content { font-size: 9pt; font-weight: normal; } .content th { font-size: 9pt; font-weight: normal; } .rowEven { background-color: #6B76A1; color: white; } .rowOdd { background-color: #344FB2; color: white; } table.footer { background-color: #344FB2; border: 1px black solid; color: white; margin-top: 1em; width: 100%; } table.settingsTable { border: 1px solid #6B76A1; } table.openMessageTable, table.lookupResultsTable { border: 1px solid #6B76A1; } td.settingsPanel { border: 1px solid #6B76A1; } td.naked { padding: 0px; margin: 0px; border: none } td.openMessageCloser { text-align: right; } .menuIndent { width: 14%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; } td.historyNavigatorBottom { text-align: right; } tr.rowHighlighted { background-color: #000000; color: #eeeeee; } td.logo2menuSpace { height: 0.8em; } a.changeSettingLink { background-color: transparent; color: #aabbcc; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } tr.rowBoundary { background-color: #23367D; } div.helpMessage { background-color: #23367D; border: 1px solid black; padding: 0.5em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Menu Settings */ .menuLink { display: block; width: 100%; } /*********************************************************/ /* Positioning */ .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .refreshLink { margin-top: 0.5em; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .checkLabel { border: 1px solid #344FB2; white-space: nowrap; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #999999; } popfile-1.1.3+dfsg/skins/default/0000775000175000017500000000000011710356074016124 5ustar danieldanielpopfile-1.1.3+dfsg/skins/default/xmlrpc-port.thtml0000664000175000017500000000156511624177324021477 0ustar danieldaniel
" />
" />
" />
popfile-1.1.3+dfsg/skins/default/xmlrpc-local.thtml0000664000175000017500000000224311624177324021577 0ustar danieldaniel
:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/windows-configuration.thtml0000664000175000017500000000515611624177324023547 0ustar danieldaniel
" /> " /> " />

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/view-scores-widget.thtml0000664000175000017500000001423211624177324022732 0ustar danieldaniel
    
  
">           

() &view=&start_message=&format=freq#scores"> &view=&start_message=&format=prob#scores"> &view=&start_message=&format=score#scores">

    ">  
">     ">    

;"> (: ) ;"> (: )
.bmp" width="" height="10" alt="" title=""> .bmp" width="" height="10" alt="" title="">
popfile-1.1.3+dfsg/skins/default/view-quickmagnets-widget.thtml0000664000175000017500000000444511624177324024134 0ustar danieldaniel

" /> " />
: " class="magnetsAddType" value="" />
" />
popfile-1.1.3+dfsg/skins/default/view-page.thtml0000664000175000017500000002366411624177324021100 0ustar danieldaniel

">
">
| | |
" /> " /> " /> " /> " /> " />
:
:
:
:
:
: ">
">
" value=""> : : " />

&session=&text=1"> ">
popfile-1.1.3+dfsg/skins/default/style.css0000664000175000017500000000771711624177324020015 0ustar danieldaniel/*********************************************************/ /* Main Body */ body { color: #000000; background-color: #FFFFFF; font-family: sans-serif; font-size: 100%; } /*********************************************************/ /* Shell structure */ .shell, .shellTop { color: #000000; background-color: #EDEDCA; border: 3px #CCCC99 solid; } table.head { width: 100%; } td.head { font-weight: normal; font-size: 1.8em; } table.footer { width: 100%; } td.footerBody { width:33%; text-align: center; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.8em; } /*********************************************************/ /* Menu Settings */ .menu { font-size: 1.2em; font-weight: bold; width: 100%; } .menuSelected { color: #000000; background-color: #CCCC99; width: 14%; } .menuStandard { color: #000000; background-color: #EDEDCA; width: 14%; } .menuIndent { width: 8%; } .menuLink { display: block; width: 100%; } /*********************************************************/ /* Table Settings */ table.settingsTable { border: 1px solid #CCCC99; } td.settingsPanel { border: 1px solid #CCCC99; } table.openMessageTable { border: 3px solid #CCCC99; } td.openMessageBody { text-align: left; } td.openMessageCloser { text-align: right; } tr.rowEven { color: #000000; background-color: #EDEDCA; } tr.rowOdd { color: #000000; background-color: #DFDFAF; } tr.rowHighlighted { color: #000000; background-color: #B7B7B7; } tr.rowBoundary { background-color: #CCCC99; } table.lookupResultsTable { border: 3px solid #CCCC99; } /*********************************************************/ /* Graphics */ td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } span.graphFont { font-size: x-small; } /*********************************************************/ /* Messages */ div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } div.helpMessage { background-color: #DFDFAF; border: 2px solid #CCCC99; padding: 0.4em; } div.helpMessage form { margin: 0; } /*********************************************************/ /* Form Labels */ th.historyLabel { text-align: left; font-weight: bold; } .historyLabelSort { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } .bucketsWidgetStateOn, .bucketsWidgetStateOff { font-weight: bold; } .configWidgetStateOn, .configWidgetStateOff { font-weight: bold; } .securityWidgetStateOn, .securityWidgetStateOff { font-weight: bold; } /*********************************************************/ /* Positioning */ td.historyWidgetsTop form { margin: 0; padding: 0; } form.historyForm { margin: 0; padding: 0; } .historyNavigatorTop, .historyNavigatorBottom { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { display:inline; } .refreshLink { margin-top: 0.5em; } .magnetsTable caption { text-align: left; } h2.history, h2.buckets, h2.magnets, h2.users { margin-top: 0; margin-bottom: 0.3em; } .search { display: inline; float: left; padding-right: 1em; } .filter { display: inline; } .removeButtonsTop { padding-bottom: 1em; } .viewHeadings { display: inline; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #DFDFAF; } popfile-1.1.3+dfsg/skins/default/socks-widget.thtml0000664000175000017500000000326511624177324021612 0ustar danieldaniel

_socks_server" id="SOCKSServer" value="" /> _socks_server" value="" /> " />

_socks_port" type="text" id="configSOCKSPort" value="" /> _socks_port" value="" /> " />
popfile-1.1.3+dfsg/skins/default/smtp-security-local.thtml0000664000175000017500000000224711624177324023126 0ustar danieldaniel
:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/smtp-configuration.thtml0000664000175000017500000000424011624177324023031 0ustar danieldaniel
" /> " /> " />


:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/smtp-chain-server.thtml0000664000175000017500000000120011624177324022541 0ustar danieldaniel

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/smtp-chain-server-port.thtml0000664000175000017500000000117611624177324023537 0ustar danieldaniel

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/shutdown-page.thtml0000664000175000017500000000026211624177324021766 0ustar danieldaniel

popfile-1.1.3+dfsg/skins/default/session-page.thtml0000664000175000017500000000036311624177324021600 0ustar danieldaniel



popfile-1.1.3+dfsg/skins/default/security-page.thtml0000664000175000017500000001455411624177324021773 0ustar danieldaniel ">

:
" /> " /> " />


" /> " /> " />

:
" /> " /> " />

:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/pop3-security-panel.thtml0000664000175000017500000000223511624177324023026 0ustar danieldaniel
:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/pop3-configuration-panel.thtml0000664000175000017500000000624511624177324024033 0ustar danieldaniel

" /> " /> " />

" /> " /> " />
:
" /> " />
" /> " />
popfile-1.1.3+dfsg/skins/default/pop3-chain-panel.thtml0000664000175000017500000000261011624177324022236 0ustar danieldaniel

" /> " /> " />

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/password-page.thtml0000664000175000017500000000141011624177324021751 0ustar danieldaniel

" /> " />
popfile-1.1.3+dfsg/skins/default/nntp-separator.thtml0000664000175000017500000000122711624177324022160 0ustar danieldaniel

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/nntp-security-local.thtml0000664000175000017500000000222611624177324023117 0ustar danieldaniel
:
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/nntp-port.thtml0000664000175000017500000000115711624177324021146 0ustar danieldaniel

" /> " /> " />
popfile-1.1.3+dfsg/skins/default/nntp-force-fork.thtml0000664000175000017500000000226111624177324022214 0ustar danieldaniel :
" /> " /> " />
popfile-1.1.3+dfsg/skins/default/magnet.png0000664000175000017500000000050211624177324020105 0ustar danieldaniel臼NG  IHDR(-SWPLTEタタタタワタヲハ||~~~ォシヨタ::ヘ[[給許末イイイタタタネネネヨヨヨワワワ~癜tRNS@齎fbKGDH pHYs  メン~tIMEヤ 3ヒ]セdIDATxレu拶0{P、Hユ゚)リ&m&ール~ツ9オヨjトLD寤,ナア凝リ(!タゥYU(*y[f羈^F8吃<咼投ッ!b_ソa・b・|髞「 etDラTIENDョB`popfile-1.1.3+dfsg/skins/default/magnet-page.thtml0000664000175000017500000001345311624177324021374 0ustar danieldaniel

">
: " value="" size="" /> " /> " type="hidden" value="" /> " type="hidden" value="" /> " type="hidden" value="" />
" /> " />
" /> " /> " />




" />





" /> " /> " />


popfile-1.1.3+dfsg/skins/default/magnet-navigator.thtml0000664000175000017500000000155311624177324022450 0ustar danieldaniel : [&session=">] [&session=">] [&session=">] popfile-1.1.3+dfsg/skins/default/imap-watch-more-folders.thtml0000664000175000017500000000114511624177324023630 0ustar danieldaniel
" />
" />
popfile-1.1.3+dfsg/skins/default/imap-watch-folders.thtml0000664000175000017500000000176111624177324022674 0ustar danieldaniel


" /> " />
popfile-1.1.3+dfsg/skins/default/imap-update-mailbox-list.thtml0000664000175000017500000000153411624177324024014 0ustar danieldaniel
" /> " />

popfile-1.1.3+dfsg/skins/default/imap-options.thtml0000664000175000017500000000177111624177324021626 0ustar danieldaniel
/>


" />

" /> " />

popfile-1.1.3+dfsg/skins/default/imap-connection-details.thtml0000664000175000017500000000433111624177324023710 0ustar danieldaniel

" />

" />
/>

" />

" />

" /> " />


popfile-1.1.3+dfsg/skins/default/imap-bucket-folders.thtml0000664000175000017500000000237111624177324023041 0ustar danieldaniel


" /> " />
popfile-1.1.3+dfsg/skins/default/history-search-filter-widget.thtml0000664000175000017500000000512211624177324024711 0ustar danieldaniel
" /> " />    " /> " /> " /> /> " />
popfile-1.1.3+dfsg/skins/default/history-page.thtml0000664000175000017500000002770511624177324021627 0ustar danieldaniel


" /> " />


" /> " />

()

">

" /> " /> " /> " /> " /> " /> " /> " /> ()" /> ">
&setsort="> " />
">
" class="checkbox" name="remove_"/> " name="rowid_" value=""/> "> "> "> "> " href="/view?view="> "> "> &showbucket="> "> " value="" />
" alt="" src="/skins/default/magnet.png">
  ">
">
" /> " /> ()" />
" />
">
: " /> " /> " />

(">)

. . .
popfile-1.1.3+dfsg/skins/default/history-navigator-widget.thtml0000664000175000017500000000165711624177324024164 0ustar danieldaniel: [">< ] ... [">] ["> >] popfile-1.1.3+dfsg/skins/default/history-javascript.thtml0000664000175000017500000000116711624177324023053 0ustar danieldaniel popfile-1.1.3+dfsg/skins/default/corpus-page.thtml0000664000175000017500000005074311624177324021437 0ustar danieldaniel


" /> " />


" /> " />
" /> ">

&showbucket="> ">   _subject" checked="checked" /> _xtc" checked="checked" /> _xpl" checked="checked" /> _quarantine" checked="checked" />

" />

">

:
:

:
 
" /> " />
(: )

 

 

">


" /> " />

" /> " />

" /> " />


" /> " />

">

     
">

popfile-1.1.3+dfsg/skins/default/configuration-page.thtml0000664000175000017500000002477011624177324022774 0ustar danieldaniel ">


" /> " />

" /> " />


" /> " /> " />

" />
" /> " /> " />


" class="checkbox" name=""
" /> " />


" /> " /> " />


" /> " /> " />

" name="session" /> " />

" class="downloadLogLink">

popfile-1.1.3+dfsg/skins/default/common-top.thtml0000664000175000017500000000075411624177324021277 0ustar danieldaniel "> <TMPL_VAR NAME="Localize_Header_Title"> style.css" title="POPFile"> popfile-1.1.3+dfsg/skins/default/common-middle.thtml0000664000175000017500000000772411624177324021737 0ustar danieldaniel" onLoad="OnLoadHandler()">
 

">
&mi=&bu=" /> &mc=&ec=" /> popfile-1.1.3+dfsg/skins/default/common-javascript.thtml0000664000175000017500000000013411624177324022633 0ustar danieldaniel popfile-1.1.3+dfsg/skins/default/common-bottom.thtml0000664000175000017500000000336611624177324022003 0ustar danieldaniel
popfile-1.1.3+dfsg/skins/default/bucket-page.thtml0000664000175000017500000000717511624177324021402 0ustar danieldaniel

  ()
 

" /> " /> " />

">
- - &showbucket=&showletter=">
&lookup=Lookup&word=#Lookup">  
popfile-1.1.3+dfsg/skins/default/bar-chart-widget.thtml0000664000175000017500000000252711624177324022333 0ustar danieldaniel ;">   ">   "> ">
; width:%;" title=" ()">
" align="right"> 100%
popfile-1.1.3+dfsg/skins/default/advanced-page.thtml0000664000175000017500000001167611624177324021673 0ustar danieldaniel

">
"> ">

" /> " />

" /> " />


" value="" id=""> " value="" id="">

" /> " name="update_params">

popfile-1.1.3+dfsg/skins/coolyellow/0000775000175000017500000000000011710356074016670 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolyellow/style.css0000664000175000017500000001236711624177324020556 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #ffff99; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #fff8dc; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #fffacd; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #ffff99; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #ffff99; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #fffacd; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #ffff99; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #ffff99; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #fffacd; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #fffacd; border: 1px solid black; } popfile-1.1.3+dfsg/skins/coolorange/0000775000175000017500000000000011710356074016630 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolorange/style.css0000664000175000017500000001233411624177324020510 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #ffcc66; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #faebd7; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #ff9900; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #ffcc66; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #ffcc66; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #ff9900; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #ffcc66; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #ffcc66; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #ff9900; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #ff9900; } popfile-1.1.3+dfsg/skins/coolmint/0000775000175000017500000000000011710356074016324 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolmint/style.css0000664000175000017500000001233411624177324020204 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #82e286; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #ddf1e3; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #b2f7b7; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #82e286; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #82e286; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #b2f7b7; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #82e286; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #82e286; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #b2f7b7; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #b2f7b7; } popfile-1.1.3+dfsg/skins/coolgreen/0000775000175000017500000000000011710356074016455 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolgreen/style.css0000664000175000017500000001233411624177326020337 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #66cc66; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #eeeeee; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #66ff66; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #66cc66; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #66cc66; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #66ff66; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #66cc66; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #66cc66; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #66ff66; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #66ff66; } popfile-1.1.3+dfsg/skins/coolbrown/0000775000175000017500000000000011710356074016504 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolbrown/style.css0000664000175000017500000001233411624177324020364 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #deb887; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #ffdead; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #cd853f; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #deb887; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #deb887; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #cd853f; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #deb887; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #deb887; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #cd853f; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #cd853f; } popfile-1.1.3+dfsg/skins/coolblue/0000775000175000017500000000000011710356074016304 5ustar danieldanielpopfile-1.1.3+dfsg/skins/coolblue/style.css0000664000175000017500000001233411624177324020164 0ustar danieldanielbody { background-color: #FFFFFF; border: 0; font-family: tahoma, arial, sans-serif; color: #000000; margin: 10px 20px 20px 20px; font-size: 10pt; } h2 { font-size: 11pt; font-weight: bold; } h2.history { margin-top: 0; margin-bottom: 0.3em; } .removeButtonsTop { padding-bottom: 1em; } .shell, .shellTop { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 0px; border-left: #000000 2px solid; color: #000000; border-bottom: #000000 2px solid; background-color: #6699cc; } input, select, textarea { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: #000000; border-bottom: #000000 1px solid; font-family: tahoma, arial, serif; background-color: #cccccc; } input.checkbox { background-color: transparent; border: 0; } input.submit:hover { background-color: #FFFFFF; } .menu { font-size: 10pt; font-weight: bold; width: 100%; } .menuSelected { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #99ccff; font-size: 10pt; } .menuStandard { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; width: 16%; color: black; background-color: #6699cc; font-size: 10pt; } .menuLink { display: block; width: 100%; } tr.rowEven { border-right: #000000 2px solid; border-top: #000000 2px solid; border-left: #000000 2px solid; color: black; border-bottom: #000000 2px solid; background-color: #6699cc; } tr.rowOdd { border-right: #000000 1px solid; border-top: #000000 1px solid; border-left: #000000 1px solid; color: black; border-bottom: #000000 1px solid; background-color: #99ccff; } a:link { color: #000000; background-color: transparent; text-decoration: none; } a:visited { color: #333333; background-color: transparent; text-decoration: none; } a:hover { text-decoration: underline; } hr { color: #000000; background-color: transparent; } td.naked { padding: 0; margin: 0; border: 0; } td.logo2menuSpace { height: 0.5em; } td.head { font-weight: bold; font-size: 12pt; } table.head { border-right: #000000 2px; border-top: #000000 2px; font-weight: bold; font-size: 12pt; background: #6699cc; margin: 0px; border-left: #000000 2px; width: 100%; color: #000000; border-bottom: #000000 2px; font-family: tahoma, arial, sans-serif; } a.logoutLink, a.shutdownLink { font-size: 10pt; font-weight: normal; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; width: 33%; } table.footer { border-right: #000000 2px solid; border-top: #000000 2px solid; margin: 1em 0px 0px; border-left: #000000 2px solid; width: 100%; color: #000000; border-bottom: #000000 2px solid; background-color: #6699cc; } table.settingsTable { border: 1px solid #000000; } table.openMessageTable, table.lookupResultsTable { border: 2px solid #000000; } td.openMessageCloser { text-align: right; } td.openMessageBody { text-align: left; } td.settingsPanel { border: 1px solid #000000; } .menuIndent { width: 2%; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } span.graphFont { font-size: x-small; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configuration { font-size: 11pt; } .configurationLabel { font-size: 10pt; font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } a.menuLink { font-weight:bold; } table.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } table.historyButtonsBottom { width: 100%; margin-top: 0.6em; } td.historyNavigatorTop { text-align: right; vertical-align: top; } .historyNavigatorTop form, .historyNavigatorBottom form { margin: 0.2em 0; } td.historyNavigatorBottom { text-align: right; } table.historyWidgetsBottom { width: 100%; margin-top: 0.6em; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } tr.rowBoundary { background-color: #000000; } div.helpMessage { background-color: #99ccff; border: #000000 2px solid; padding: 0.3em; } div.helpMessage form { margin: 0; } .viewHeadings { display: inline; } td.top20 td.historyNavigatorTop a + a { border-left: 1px solid black; padding-left: 0.5em; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #99ccff; } popfile-1.1.3+dfsg/skins/blue/0000775000175000017500000000000011710356074015427 5ustar danieldanielpopfile-1.1.3+dfsg/skins/blue/style.css0000664000175000017500000000767311624177324017321 0ustar danieldanielbody { background-color: #919AC9; border: none; font-family: verdana, sans-serif; color: white; } a { color: white; background-color: transparent; } input, select, textarea, .submit { color: white; background-color: #363E68; border: 1px #919AC9 solid; font-weight: bold; font-family: verdana, sans-serif; font-size: 0.9em; } input.submit:hover { background-color: #363E75; } .shell, .shellTop { background-color: #4C558E; border: 3px #363E68 solid; color: white; } table.head { width: 100%; background-color : #4C558E; color: white; } td.head { font-weight: normal; font-size: 1.3em; background-color : #4C558E; color: white; } a.shutdownLink, a.logoutLink { background-color : #4C558E; color: white; font-size: 1em; } .menu { font-size: 1.1em; font-weight: bold; width: 100%; } .menuLink { color: white; background-color: transparent; } .menuSelected { background-color: #363E68; width: 150px; color: white; } .menuStandard { background-color: #4C558E; width: 150px; color: white; } tr.rowEven { background-color: #4C558E; color: white; } tr.rowOdd { background-color: #363E68; color: white; } table.settingsTable { border: 1px solid #363E68; } table.openMessageTable, table.lookupResultsTable { border: 3px solid #363E68; } td.settingsPanel { border: 1px solid #363E68; } td.naked { padding: 0px; margin: 0px; border: none } a.bottomLink { background-color : transparent; color: white; } .menuIndent { width: 7%; } td.historyWidgetsTop { width: 100%; margin-left: 1.5em; margin-top: 0.6em; margin-bottom: 1.0em; } td.historyNavigatorTop { text-align: right; padding-right: 0.5em; vertical-align: top; } td.historyNavigatorBottom { text-align: right; padding-right: 0.5em; padding-bottom: 1.0em; } table.historyWidgetsBottom { width: 100%; margin-left: 0.5em; margin-top: 1.5em; } a.messageLink:link { background-color : transparent; color: white; } td.openMessageCloser { text-align: right; } a.changeSettingLink { background-color: transparent ; color: #DDEEFF; } table.footer { width: 100%; margin-top: 1em; } td.footerBody { text-align: center; padding-left: 5%; padding-right: 5%; background-color: #4C558E; border: 3px #252A49 solid; color: white; width: 33%; } h2.security { color: white; background-color: transparent; } h2.advanced { color: white; background-color: transparent; } td.logo2menuSpace { height: 0.8em; } tr.rowHighlighted { background-color: #000030; color: #EEEEEE; } span.graphFont { font-size: x-small; } .bucketsLabel { font-weight: bold; } .magnetsLabel { font-weight: bold; } .securityLabel { font-weight: bold; } .configurationLabel { font-weight: bold; } .advancedLabel { font-weight: bold; } .passwordLabel { font-weight: bold; } .sessionLabel { font-weight: bold; } div.error01 { background-color: transparent; color: red; font-size: larger; } div.error02 { background-color: transparent; color: red; } td.accuracy0to49 { background-color: red; color: black; } td.accuracy50to93 { background-color: yellow; color: black; } td.accuracy94to100 { background-color: green; color: black; } span.bucketsWidgetState { font-weight: bold; } span.configWidgetState { font-weight: bold; } span.securityWidgetState { font-weight: bold; } .historyLabel { font-weight: normal; } .historyLabel em { font-weight: bold; font-style: normal; } tr.rowBoundary { background-color: #FFFFFF; } div.helpMessage { border: 2px solid #363E68; padding: 0.4em; } div.helpMessage form { margin: 0; } .menuLink { display: block; width: 100%; } .historyMagnetUsed { overflow: hidden; white-space: nowrap; vertical-align: middle; } .historyMagnetUsed img { vertical-align: bottom; } .historyMagnetUsed span { font-size:80%; vertical-align: middle; } div.historySearchFilterActive { background-color: #363E68; } popfile-1.1.3+dfsg/Services/0000775000175000017500000000000011710356074015134 5ustar danieldanielpopfile-1.1.3+dfsg/Services/IMAP.pm0000664000175000017500000015103111710356074016221 0ustar danieldaniel# POPFILE LOADABLE MODULE package Services::IMAP; use POPFile::Module; use Services::IMAP::Client; @ISA = ("POPFile::Module"); use Carp; use Fcntl; # ---------------------------------------------------------------------------- # # IMAP.pm --- a module to use POPFile for an IMAP connection. # # Copyright (c) 2001-2011 John Graham-Cumming # # $Revision: 3776 $ # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Originally created by Manni Heumann (mannih2001@users.sourceforge.net) # Modified by Sam Schinke (sschinke@users.sourceforge.net) # Patches by David Lang (davidlang@users.sourceforge.net) # Moved location by John Graham-Cumming (jgrahamc@users.sf.net) # # The documentation for this module can be found on # http://popfile.sf.net/cgi-bin/wiki.pl?ExperimentalModules/Imap # # ---------------------------------------------------------------------------- use Digest::MD5 qw( md5_hex ); use strict; use warnings; use locale; my $cfg_separator = "-->"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = $type->SUPER::new(); $self->name( 'imap' ); $self->{classifier__} = 0; # Here are the variables used by this module: # A place to store the last response that the IMAP server sent us $self->{last_response__} = ''; # A place to store the last command we sent to the server $self->{last_command__} = ''; # The tag that preceeds any command we sent, actually just a simple counter var $self->{tag__} = 0; # A list of mailboxes on the server: $self->{mailboxes__} = []; # The session id for the current session: $self->{api_session__} = ''; # A hash to hold per-folder data (watched and output flag + socket connection) # This data structure is extremely important to the work done by this # module, so don't mess with it! # The hash contains one key per service folder. # This key will return another hash. This time the keys are fixed and # can be {output} for an output folder # {watched} for a watched folder. # {imap} will hold a valid socket object for the connection of this folder. $self->{folders__} = (); # A flag that tells us that the folder list has changed $self->{folder_change_flag__} = 0; # A hash containing the hash values of messages that we encountered # during a single run through service(). # If you provide a hash as a key and if that key exists, the value # will be the folder where the original message was placed (or left) in. $self->{hash_values__} = (); $self->{history__} = 0; $self->{imap_error} = ''; return $self; } # ---------------------------------------------------------------------------- # # initialize # # ---------------------------------------------------------------------------- sub initialize { my $self = shift; $self->config_( 'hostname', '' ); $self->config_( 'port', 143 ); $self->config_( 'login', '' ); $self->config_( 'password', '' ); $self->config_( 'update_interval', 20 ); $self->config_( 'expunge', 0 ); $self->config_( 'use_ssl', 0 ); # Those next variables have getter/setter functions and should # not be used directly: $self->config_( 'watched_folders', "INBOX" ); # function watched_folders $self->config_( 'bucket_folder_mappings', '' ); # function folder_for_bucket $self->config_( 'uidvalidities', '' ); # function uid_validity $self->config_( 'uidnexts', '' ); # function uid_next # Diabled by default $self->config_( 'enabled', 0 ); # Training mode is disabled by default: $self->config_( 'training_mode', 0 ); # Set the time stamp for the last update to the current time # minus the update interval so that we will connect as soon # as service() is called for the first time. $self->{last_update__} = time - $self->config_( 'update_interval' ); return $self->SUPER::initialize(); } # ---------------------------------------------------------------------------- # # Start. Get's called by the loader and makes us run. # # We try to connect to our IMAP server here, and get a list of # folders / mailboxes, so we can populate the configuration UI. # # ---------------------------------------------------------------------------- sub start { my $self = shift; if ( $self->config_( 'enabled' ) == 0 ) { return 2; } $self->register_configuration_item_( 'configuration', 'imap_0_connection_details', 'imap-connection-details.thtml', $self ); $self->register_configuration_item_( 'configuration', 'imap_1_watch_folders', 'imap-watch-folders.thtml', $self ); $self->register_configuration_item_( 'configuration', 'imap_2_watch_more_folders', 'imap-watch-more-folders.thtml', $self ); $self->register_configuration_item_( 'configuration', 'imap_3_bucket_folders', 'imap-bucket-folders.thtml', $self ); $self->register_configuration_item_( 'configuration', 'imap_4_update_mailbox_list', 'imap-update-mailbox-list.thtml', $self ); $self->register_configuration_item_( 'configuration', 'imap_5_options', 'imap-options.thtml', $self ); return $self->SUPER::start(); } # ---------------------------------------------------------------------------- # stop # # Clean up - release the session key # # ---------------------------------------------------------------------------- sub stop { my $self = shift; $self->disconnect_folders__(); } # ---------------------------------------------------------------------------- # # service # # This get's frequently called by the framework. # It checks whether our checking interval has elapsed and if it has, # it goes to work. # # ---------------------------------------------------------------------------- sub service { my $self = shift; if ( time - $self->{last_update__} >= $self->config_( 'update_interval' ) ) { # Since the IMAP-Client module can throw an exception, i.e. die if # it detects a lost connection, we eval the following code to be able # to catch the exception. We also tell Perl to ignore broken pipes. eval { local $SIG{'PIPE'} = 'IGNORE'; local $SIG{'__DIE__'}; if ( $self->config_( 'training_mode' ) == 1 ) { $self->train_on_archive__(); } else { # If we haven't yet set up a list of serviced folders, # or if the list was changed by the user, build up a # list of folder in $self->{folders__} if ( ( keys %{$self->{folders__}} == 0 ) || ( $self->{folder_change_flag__} == 1 ) ) { $self->build_folder_list__(); } $self->connect_server__(); # Reset the hash containing the hash values we have seen the # last time through service. $self->{hash_values__} = (); # Now do the real job foreach my $folder ( keys %{$self->{folders__}} ) { if ( exists $self->{folders__}{$folder}{imap} ) { $self->scan_folder( $folder ); } } } }; # if an exception occurred, we try to catch it here if ( $@ ) { $self->disconnect_folders__(); # If we caught an exception, we better reset training_mode $self->config_( 'training_mode', 0 ); # say__() and get_response__() will die with this message: if ( $@ =~ /^POPFILE-IMAP-EXCEPTION: (.+\)\))/s ) { $self->log_( 0, $1 ); } # If we didn't die but somebody else did, we have empathy. else { die $@; } } # Save the current time. $self->{last_update__} = time; } return 1; } #---------------------------------------------------------------------------- # build_folder_list__ # # This function builds a list of all the folders that we have to care # about. This list consists of the folders we are watching for new mail # and of the folders that we are watching for reclassification requests. # The complete list is stored in a hash: $self->{folders__}. # The keys in this hash are the names of our folders, the values represent # flags. Currently, the flags can be # {watched} for watched folders and # {output} for output/bucket folders. # The function connect_folders__() will later add an {imap} key that will # hold the connection for that folder. # # arguments: # none. # # return value: # none. #---------------------------------------------------------------------------- sub build_folder_list__ { my $self = shift; $self->log_( 1, "Building list of serviced folders." ); # At this point, we simply reset the folders hash. # This isn't really elegant because it will leave dangling connections # if we have already been connected. But I trust in Perl's garbage collection # and keep my fingers crossed. %{$self->{folders__}} = (); # watched folders foreach my $folder ( $self->watched_folders__() ) { $self->{folders__}{$folder}{watched} = 1; } # output folders foreach my $bucket ( $self->classifier()->get_all_buckets( $self->api_session() ) ) { my $folder = $self->folder_for_bucket__( $bucket ); if ( defined $folder ) { $self->{folders__}{$folder}{output} = $bucket; } } # If this is a new POPFile installation that isn't yet # configured, our hash will have exactly one key now # which will point to the INBOX. Since this isn't enough # to do anything meaningful, we simply reset the hash: if ( ( keys %{$self->{folders__}} ) == 1 ) { %{$self->{folders__}} = (); } # Reset the folder change flag $self->{folder_change_flag__} = 0; } # ---------------------------------------------------------------------------- # # connect_server__ - Connect to the IMAP server if we are only using a single # connection. The method will connect to the server, login # retrieve the list of mailboxes and do a status on each # of the folders that we are interested in to see whether # the UIDVALIDITY has changed. # # IN: - # OUT: will die on failure # ---------------------------------------------------------------------------- sub connect_server__ { my $self = shift; # Establish a single connection but gather all the data # we need for each folder. my $imap = undef; foreach my $folder ( keys %{$self->{folders__}} ) { # We may already have a valid connection: if ( exists $self->{folders__}{$folder}{imap} ) { last; } # The folder may be write-only: if ( exists $self->{folders__}{$folder}{output} && ! exists $self->{folders__}{$folder}{watched} && $self->classifier()->is_pseudo_bucket( $self->api_session(), $self->{folders__}{$folder}{output} ) ) { next; } # We may have to create a fresh connection here. if ( ! defined $imap ) { # Have we got a stored active connection? $imap = $self->{folders__}{$folder}{imap}; # Nope, must be the first time we end up here. if ( ! defined $imap ) { $imap = $self->new_imap_client(); if ( $imap ) { $self->{folders__}{$folder}{imap} = $imap; } else { die "POPFILE-IMAP-EXCEPTION: Could not connect: $self->{imap_error} " . __FILE__ . '(' . __LINE__ . '))'; } } } # Build a list of IMAP mailboxes if we haven't already got one: unless ( @{$self->{mailboxes__}} ) { @{$self->{mailboxes__}} = $imap->get_mailbox_list(); } # Do a STATUS to check UIDVALIDITY and UIDNEXT my $info = $imap->status( $folder ); my $uidnext = $info->{UIDNEXT}; my $uidvalidity = $info->{UIDVALIDITY}; if ( defined $uidvalidity && defined $uidnext ) { $self->{folders__}{$folder}{imap} = $imap; # If we already have a UIDVALIDITY value stored, # we compare the old and the new value. if ( defined $imap->uid_validity( $folder ) ) { if ( $imap->check_uidvalidity( $folder, $uidvalidity ) ) { # That's the nice case. # But let's make sure that our UIDNEXT value is also valid unless ( defined $imap->uid_next( $folder ) ) { $self->log_( 0, "Detected invalid UIDNEXT configuration value for folder $folder. Some new messages might have been skipped." ); $imap->uid_next( $folder, $uidnext ); } } else { # The validity has changed, we log this and update our stored # values for UIDNEXT and UIDVALIDITY $self->log_( 0, "Changed UIDVALIDITY for folder $folder. Some new messages might have been skipped." ); $imap->uid_validity( $folder, $uidvalidity ); $imap->uid_next( $folder, $uidnext ); } } else { # We don't have a stored value, so let's change that. $self->log_( 0, "Storing UIDVALIDITY for folder $folder." ); $imap->uid_validity( $folder, $uidvalidity ); $imap->uid_next( $folder, $uidnext ); } } else { $self->log_( 0, "Could not STATUS folder $folder." ); $imap->logout(); die "POPFILE-IMAP-EXCEPTION: Could not get a STATUS for IMAP folder $folder (" . __FILE__ . '(' . __LINE__ . '))'; } } } # ---------------------------------------------------------------------------- # # disconnect_folders__ # # The test suite needs a way to disconnect all the folders after one test is # done and the next test needs to be done with different settings. # # ---------------------------------------------------------------------------- sub disconnect_folders__ { my $self = shift; $self->log_( 1, "Trying to disconnect all connections." ); foreach my $folder ( keys %{$self->{folders__}} ) { my $imap = $self->{folders__}{$folder}{imap}; if ( defined $imap && $imap->connected() ) { # Workaround for POPFile crashes when disconnecting from server eval { $imap->logout( $folder ); }; } } %{$self->{folders__}} = (); } # ---------------------------------------------------------------------------- # # scan_folder # # This function scans a folder on the IMAP server. # According to the attributes of a folder (watched, output), and the attributes # of the message (new, classified, etc) it then decides what to do with the # messages. # There are currently three possible actions: # 1. Classify the message and move to output folder # 2. Reclassify message # 3. Ignore message (if you want to call that an action) # # Arguments: # # $folder: The folder to scan. # # ---------------------------------------------------------------------------- sub scan_folder { my $self = shift; my $folder = shift; # make the flags more accessible. my $is_watched = ( exists $self->{folders__}{$folder}{watched} ) ? 1 : 0; my $is_output = ( exists $self->{folders__}{$folder}{output } ) ? $self->{folders__}{$folder}{output} : ''; $self->log_( 1, "Looking for new messages in folder $folder." ); my $imap = $self->{folders__}{$folder}{imap}; # Do a NOOP first. Certain implementations won't tell us about # new messages while we are connected and selected otherwise: if ( ! $imap->noop() ) { # Now what? } my $moved_message = 0; my @uids = (); @uids = $imap->get_new_message_list_unselected( $folder ); # We now have a list of messages with UIDs greater than or equal # to our last stored UIDNEXT value (of course, the list might be # empty). Let's iterate over that list. foreach my $msg ( @uids ) { $self->log_( 1, "Found new message in folder $folder (UID: $msg)" ); my $hash = $self->get_hash( $folder, $msg ); $imap->uid_next( $folder, $msg + 1 ); if ( ! defined $hash ) { $self->log_( 0, "Skipping message $msg." ); next; } # Watch our for those pesky duplicate and triplicate spam messages: if ( exists $self->{hash_values__}{$hash} ) { my $destination = $self->{hash_values__}{$hash}; if ( $destination ne $folder ) { $self->log_( 0, "Found duplicate hash value: $hash. Moving the message to $destination." ); $imap->move_message( $msg, $destination ); $moved_message++; } else { $self->log_( 0, "Found duplicate hash value: $hash. Ignoring duplicate in folder $folder." ); } next; } # Find out what we are dealing with here: if ( $is_watched ) { if ( $self->can_classify__( $hash ) ) { my $result = $self->classify_message( $msg, $hash, $folder ); if ( defined $result ) { if ( $result ne '' ) { $moved_message++; $self->{hash_values__}{$hash} = $result; } else { $self->{hash_values__}{$hash} = $folder; } } next; } } if ( my $bucket = $is_output ) { if ( my $old_bucket = $self->can_reclassify__( $hash, $bucket ) ) { my $result = $self->reclassify_message( $folder, $msg, $old_bucket, $hash ); next; } } # If we get here despite all those next statements, we do nothing and say so $self->log_( 1, "Ignoring message $msg" ); } # After we are done with the folder, we issue an EXPUNGE command # if we were told to do so. if ( $moved_message && $self->config_( 'expunge' ) ) { $imap->expunge(); } } # ---------------------------------------------------------------------------- # # classify_message # # This function takes a message UID and then tries to classify the corresponding # message to a POPFile bucket. It delegates all the house-keeping that keeps # the POPFile statistics up to date to helper functions, but the house-keeping # is done. The caller need not worry about this. # # Arguments: # # $msg: UID of the message (the IMAP folder must be SELECTed) # $hash: The hash of the message as computed by get_hash() # $folder: The name of the folder on the server in which this message was found # # Return value: # # undef on error # The name of the destination folder if the message was moved # The emtpy string if the message was not moved # # ---------------------------------------------------------------------------- sub classify_message { my $self = shift; my $msg = shift; my $hash = shift; my $folder = shift; my $moved_a_msg = ''; # open a temporary file that the classifier will # use to read the message in binary, read-write mode: my $pseudo_mailer; my $file = $self->get_user_path_( 'imap.tmp' ); unless ( sysopen( $pseudo_mailer, $file, O_RDWR | O_CREAT ) ) { $self->log_( 0, "Unable to open temporary file $file. Nothing done to message $msg. ($!)" ); return; } binmode $pseudo_mailer; # We don't retrieve the complete message, but handle # it in different parts. # Currently these parts are just headers and body. # But there is room for improvement here. # E.g. we could generate a list of parts by # first looking at the parts the message really has. my $imap = $self->{folders__}{$folder}{imap}; PART: foreach my $part ( qw/ HEADER TEXT / ) { my ($ok, @lines ) = $imap->fetch_message_part( $msg, $part ); unless ( $ok ) { $self->log_( 0, "Could not fetch the $part part of message $msg." ); return; } foreach ( @lines ) { syswrite $pseudo_mailer, $_; } my ( $class, $slot, $magnet_used ); # If we are dealing with the headers, let the # classifier have a non-save go: if ( $part eq 'HEADER' ) { sysseek $pseudo_mailer, 0, 0; ( $class, $slot, $magnet_used ) = $self->classifier()->classify_and_modify( $self->api_session(), $pseudo_mailer, undef, 1, '', undef, 0, undef ); if ( $magnet_used ) { $self->log_( 0, "Message with slot $slot was classified as $class using a magnet." ); syswrite $pseudo_mailer, "\nThis message was classified based on a magnet.\nThe body of the message was not retrieved from the server.\n"; } else { next PART; } } # We will only get here if the message was magnetized or we # are looking at the complete message. Thus we let the classifier have # a look and make it save the message to history: sysseek $pseudo_mailer, 0, 0; ( $class, $slot, $magnet_used ) = $self->classifier()->classify_and_modify( $self->api_session(), $pseudo_mailer, undef, 0, '', undef, 0, undef ); close $pseudo_mailer; unlink $file; if ( $magnet_used || $part eq 'TEXT' ) { # Move message: my $destination = $self->folder_for_bucket__( $class ); if ( defined $destination ) { if ( $folder ne $destination ) { $imap->move_message( $msg, $destination ); $moved_a_msg = $destination; } } else { $self->log_( 0, "Message cannot be moved because output folder for bucket $class is not defined." ); } $self->log_( 0, "Message was classified as $class." ); last PART; } } return $moved_a_msg; } # ---------------------------------------------------------------------------- # # reclassify_message # # This function takes a message UID and then tries to reclassify the corresponding # message from one POPFile bucket to another POPFile bucket. It delegates all the # house-keeping that keeps the POPFile statistics up to date to helper functions, # but the house-keeping # is done. The caller need not worry about this. # # Arguments: # # $folder: The folder that has received a reclassification request # $msg: UID of the message (the IMAP folder must be SELECTed) # $old_bucket: The previous classification of the message # $hash: The hash of the message as computed by get_hash() # # Return value: # # undef on error # true if things went allright # # ---------------------------------------------------------------------------- sub reclassify_message { my $self = shift; my $folder = shift; my $msg = shift; my $old_bucket = shift; my $hash = shift; my $new_bucket = $self->{folders__}{$folder}{output}; my $imap = $self->{folders__}{$folder}{imap}; my ( $ok, @lines ) = $imap->fetch_message_part( $msg, '' ); unless ( $ok ) { $self->log_( 0, "Could not fetch message $msg!" ); return; } # We have to write the message to a temporary file. # I simply use "imap.tmp" as the file name here. my $file = $self->get_user_path_( 'imap.tmp' ); if ( open my $TMP, '>', $file ) { foreach ( @lines ) { print $TMP $_; } close $TMP; my $slot = $self->history()->get_slot_from_hash( $hash ); $self->classifier()->add_message_to_bucket( $self->api_session(), $new_bucket, $file ); $self->classifier()->reclassified( $self->api_session(), $old_bucket, $new_bucket, 0 ); $self->history()->change_slot_classification( $slot, $new_bucket, $self->api_session(), 0); $self->log_( 0, "Reclassified the message with UID $msg from bucket $old_bucket to bucket $new_bucket." ); unlink $file; } else { $self->log_( 0, "Cannot open temp file $file" ); return; } } # ---------------------------------------------------------------------------- # # (g|s)etters for configuration variables # # # ---------------------------------------------------------------------------- # # folder_for_bucket__ # # Pass in a bucket name only to get a corresponding folder name # Pass in a bucket name and a folder name to set the pair # #--------------------------------------------------------------------------------------------- sub folder_for_bucket__ { my $self = shift; my $bucket = shift; my $folder = shift; my $all = $self->config_( 'bucket_folder_mappings' ); my %mapping = split /$cfg_separator/, $all; # set if ( $folder ) { $mapping{$bucket} = $folder; $all = ''; while ( my ( $k, $v ) = each %mapping ) { $all .= "$k$cfg_separator$v$cfg_separator"; } $self->config_( 'bucket_folder_mappings', $all ); } # get else { if ( exists $mapping{$bucket} ) { return $mapping{$bucket}; } else { return; } } } #--------------------------------------------------------------------------------------------- # # watched_folders__ # # Returns a list of watched folders when called with no arguments # Otherwise set the list of watched folders to whatever argument happens to be. # #--------------------------------------------------------------------------------------------- sub watched_folders__ { my $self = shift; my @folders = @_; my $all = $self->config_( 'watched_folders' ); # set if ( @folders ) { $all = ''; foreach ( @folders ) { $all .= "$_$cfg_separator"; } $self->config_( 'watched_folders', $all ); } # get else { return split /$cfg_separator/, $all; } } # ---------------------------------------------------------------------------- # # classifier - Called by the framework to set our classifier # - call it without any arguments and you'll get the classifier # # ---------------------------------------------------------------------------- sub classifier { my $self = shift; my $classifier = shift; if ( defined $classifier ) { $self->{classifier__} = $classifier; } else { return $self->{classifier__}; } } # ---------------------------------------------------------------------------- # # history - Called by the framework to set our history module, called it # without any arguments to get the history module # # ---------------------------------------------------------------------------- sub history { my $self = shift; my $history = shift; if ( defined $history ) { $self->{history__} = $history; } else { return $self->{history__}; } } # ---------------------------------------------------------------------------- # # api_session - Return the API session key and get one if we haven't done so # already. # # ---------------------------------------------------------------------------- sub api_session { my $self = shift; if ( ! $self->{api_session__} ) { $self->{api_session__} = $self->classifier()->get_session_key( 'admin', '' ); } return $self->{api_session__}; } #---------------------------------------------------------------------------- # get hash # # Computes a hash of the MID and Date header lines of this message. # Note that a folder on the server needs to be selected for this to work. # # Arguments: # # $folder: Name of the folder we are currently servicing. # $msg: message UID # # Return value: # A string containing the hash value or undef on error. # #---------------------------------------------------------------------------- sub get_hash { my $self = shift; my $folder = shift; my $msg = shift; my $imap = $self->{folders__}{$folder}{imap}; my ( $ok, @lines ) = $imap->fetch_message_part( $msg, "HEADER.FIELDS (Message-id Date Subject Received)" ); if ( $ok ) { my %header; my $last; foreach ( @lines ) { s/[\r\n]//g; last if /^$/; if ( /^([^ \t]+):[ \t]*(.*)$/ ) { $last = lc $1; push @{$header{$last}}, $2; } else { if ( defined $last ) { ${$header{$last}}[$#{$header{$last}}] .= $_; } } } my $mid = ${$header{'message-id'}}[0]; my $date = ${$header{'date'}}[0]; my $subject = ${$header{'subject'}}[0]; my $received = ${$header{'received'}}[0]; my $hash = $self->history()->get_message_hash( $mid, $date, $subject, $received ); $self->log_( 1, "Hashed message: $subject." ); $self->log_( 1, "Message $msg has hash value $hash" ); return $hash; } else { $self->log_( 0, "Could not FETCH the header fields of message $msg!" ); return; } } #---------------------------------------------------------------------------- # can_classify__ # # This function is a decider. It decides whether a message can be # classified if found in one of our watched folders or not. # # arguments: # $hash: The hash value for this message # # returns true or false #---------------------------------------------------------------------------- sub can_classify__ { my $self = shift; my $hash = shift; my $slot = $self->history()->get_slot_from_hash( $hash ); if ( $slot ne '' ) { $self->log_( 1, "Message was already classified (slot $slot)." ); return; } else { $self->log_( 1, "The message is not yet in history." ); return 1; } } #---------------------------------------------------------------------------- # can_reclassify__ # # This function is a decider. It decides whether a message can be # reclassified if found in one of our output folders or not. # # arguments: # $hash: The hash value for this message # $new_bucket: The name of the bucket the message should be classified to # # return value: # undef if the message should not be reclassified # the current classification if a reclassification is ok #---------------------------------------------------------------------------- sub can_reclassify__ { my $self = shift; my $hash = shift; my $new_bucket = shift; # We must already know the message my $slot = $self->history()->get_slot_from_hash( $hash ); if ( $slot ne '' ) { my ( $id, $from, $to, $cc, $subject, $date, $hash, $inserted, $bucket, $reclassified, undef, $magnetized ) = $self->history()->get_slot_fields( $slot ); $self->log_( 2, "get_slot_fields returned the following information:" ); $self->log_( 2, "id: $id" ); $self->log_( 2, "from: $from" ); $self->log_( 2, "to: $to" ); $self->log_( 2, "cc: $cc" ); $self->log_( 2, "subject: $subject"); $self->log_( 2, "date: $date" ); $self->log_( 2, "hash: $hash" ); $self->log_( 2, "inserted: $inserted" ); $self->log_( 2, "bucket: $bucket" ); $self->log_( 2, "reclassified: $reclassified" ); $self->log_( 2, "magnetized: $magnetized" ); # We cannot reclassify magnetized messages if ( ! $magnetized ) { # We must not reclassify a reclassified message if ( ! $reclassified ) { # new and old bucket must be different if ( $new_bucket ne $bucket ) { # The new bucket must not be a pseudo-bucket if ( ! $self->classifier()->is_pseudo_bucket( $self->api_session(), $new_bucket ) ) { return $bucket; } else { $self->log_( 1, "Will not reclassify to pseudo-bucket ($new_bucket)" ); } } else { $self->log_( 1, "Will not reclassify to same bucket ($new_bucket)." ); } } else { $self->log_( 1, "The message was already reclassified." ); } } else { $self->log_( 1, "The message was classified using a manget and cannot be reclassified." ); } } else { $self->log_( 1, "Message is unknown and cannot be reclassified." ); } return; } # ---------------------------------------------------------------------------- # # configure_item # # $name Name of this item # $templ The loaded template that was passed as a parameter # when registering # $language Current language # # ---------------------------------------------------------------------------- sub configure_item { my $self = shift; my $name = shift; my $templ = shift; my $language = shift; # conection details if ( $name eq 'imap_0_connection_details' ) { $templ->param( 'IMAP_hostname', $self->config_( 'hostname' ) ); $templ->param( 'IMAP_port', $self->config_( 'port' ) ); $templ->param( 'IMAP_login', $self->config_( 'login' ) ); $templ->param( 'IMAP_password', $self->config_( 'password' ) ); $templ->param( 'IMAP_ssl_checked', $self->config_( 'use_ssl' ) ? 'checked="checked"' : '' ); } # Which mailboxes/folders should we be watching? if ( $name eq 'imap_1_watch_folders' ) { # We can only configure this if we have a list of mailboxes on the server available if ( @{$self->{mailboxes__}} < 1 || ( ! $self->watched_folders__() ) ) { $templ->param( IMAP_if_mailboxes => 0 ); } else { $templ->param( IMAP_if_mailboxes => 1 ); # the following code will fill a loop containing another loop # The outer loop iterates over our watched folders, # the inner loop over all our mailboxes to fill the select form # Data for the outer loop, the inner loops data will be contained # in those data structures: my @loop_watched_folders = (); my $i = 0; # Loop over watched folder slot. One select form per watched folder # will be generated foreach my $folder ( $self->watched_folders__() ) { $i++; my %data_watched_folders = (); # inner loop data my @loop_mailboxes = (); # loop over IMAP mailboxes and generate a select element for reach one foreach my $mailbox ( @{$self->{mailboxes__}} ) { # Populate inner loop entries: my %data_mailboxes = (); $data_mailboxes{IMAP_mailbox} = $mailbox; # Is it currently selected? if ( $folder eq $mailbox ) { $data_mailboxes{IMAP_selected} = 'selected="selected"'; } else { $data_mailboxes{IMAP_selected} = ''; } push @loop_mailboxes, \%data_mailboxes; } $data_watched_folders{IMAP_loop_mailboxes} = \@loop_mailboxes; $data_watched_folders{IMAP_loop_counter} = $i; $data_watched_folders{IMAP_WatchedFolder_Msg} = $$language{Imap_WatchedFolder}; push @loop_watched_folders, \%data_watched_folders; } $templ->param( IMAP_loop_watched_folders => \@loop_watched_folders ); } } # Give me another watched folder. if ( $name eq 'imap_2_watch_more_folders' ) { if ( @{$self->{mailboxes__}} < 1 ) { $templ->param( IMAP_if_mailboxes => 0 ); } else { $templ->param( IMAP_if_mailboxes => 1 ); } } # Which folder corresponds to which bucket? if ( $name eq 'imap_3_bucket_folders' ) { if ( @{$self->{mailboxes__}} < 1 ) { $templ->param( IMAP_if_mailboxes => 0 ); } else { $templ->param( IMAP_if_mailboxes => 1 ); my @buckets = $self->classifier()->get_all_buckets( $self->api_session() ); my @outer_loop = (); foreach my $bucket ( @buckets ) { my %outer_data = (); my $output = $self->folder_for_bucket__( $bucket ); $outer_data{IMAP_mailbox_defined} = (defined $output) ? 1 : 0; $outer_data{IMAP_Bucket_Header} = sprintf( $$language{Imap_Bucket2Folder}, $bucket ); my @inner_loop = (); foreach my $mailbox ( @{$self->{mailboxes__}} ) { my %inner_data = (); $inner_data{IMAP_mailbox} = $mailbox; if ( defined $output && $output eq $mailbox ) { $inner_data{IMAP_selected} = 'selected="selected"'; } else { $inner_data{IMAP_selected} = ''; } push @inner_loop, \%inner_data; } $outer_data{IMAP_loop_mailboxes} = \@inner_loop; $outer_data{IMAP_bucket} = $bucket; push @outer_loop, \%outer_data; } $templ->param( IMAP_loop_buckets => \@outer_loop ); } } # Read the list of mailboxes from the server. Now! if ( $name eq 'imap_4_update_mailbox_list' ) { if ( $self->config_( 'hostname' ) eq '' ) { $templ->param( IMAP_if_connection_configured => 0 ); } else { $templ->param( IMAP_if_connection_configured => 1 ); } } # Various options for the IMAP module if ( $name eq 'imap_5_options' ) { # Are we expunging after moving messages? my $checked = $self->config_( 'expunge' ) ? 'checked="checked"' : ''; $templ->param( IMAP_expunge_is_checked => $checked ); # Update interval in seconds $templ->param( IMAP_interval => $self->config_( 'update_interval' ) ); } } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $templ The loaded template # $language The language currently in use # $form Hash containing all form items # # ---------------------------------------------------------------------------- sub validate_item { my $self = shift; my $name = shift; my $templ = shift; my $language = shift; my $form = shift; # connection details if ( $name eq 'imap_0_connection_details' ) { return $self->validate_connection_details( $name, $templ, $language, $form ); } # watched folders if ( $name eq 'imap_1_watch_folders' ) { if ( defined $form->{update_imap_1_watch_folders} ) { my $i = 1; my %folders; foreach ( $self->watched_folders__() ) { $folders{ $form->{"imap_folder_$i"} }++; $i++; } $self->watched_folders__( sort keys %folders ); $self->{folder_change_flag__} = 1; } return; } # Add a watched folder if ( $name eq 'imap_2_watch_more_folders' ) { if ( defined $form->{imap_2_watch_more_folders} ) { my @current = $self->watched_folders__(); push @current, 'INBOX'; $self->watched_folders__( @current ); } return; } # map buckets to folders if ( $name eq 'imap_3_bucket_folders' ) { if ( defined $form->{imap_3_bucket_folders} ) { # We have to make sure that there is only one bucket per folder # Multiple buckets cannot map to the same folder because how # could we reliably reclassify on move then? my %bucket2folder; my %folders; foreach my $key ( keys %$form ) { # match bucket name: if ( $key =~ /^imap_folder_for_(.+)$/ ) { my $bucket = $1; my $folder = $form->{ $key }; $bucket2folder{ $bucket } = $folder; $folders{ $folder }++; } } my $bad = 0; while ( my ( $bucket, $folder ) = each %bucket2folder ) { if ( exists $folders{$folder} && $folders{ $folder } > 1 ) { $bad = 1; } else { $self->folder_for_bucket__( $bucket, $folder ); $self->{folder_change_flag__} = 1; } } $templ->param( IMAP_buckets_to_folders_if_error => $bad ); } return; } # update the list of mailboxes if ( $name eq 'imap_4_update_mailbox_list' ) { return $self->validate_update_mailbox_list( $name, $templ, $language, $form ); } # various options if ( $name eq 'imap_5_options' ) { if ( defined $form->{update_imap_5_options} ) { # expunge or not? if ( defined $form->{imap_options_expunge} ) { $self->config_( 'expunge', 1 ); } else { $self->config_( 'expunge', 0 ); } # update interval my $form_interval = $form->{imap_options_update_interval}; if ( defined $form_interval ) { if ( $form_interval >= 10 && $form_interval <= 60*60 ) { $self->config_( 'update_interval', $form_interval ); $templ->param( IMAP_if_interval_error => 0 ); } else { $templ->param( IMAP_if_interval_error => 1 ); } } else { $templ->param( IMAP_if_interval_error => 1 ); } } return; } $self->SUPER::validate_item( $name, $templ, $language, $form ); } # ---------------------------------------------------------------------------- # # validate_connection_details - Called by validate_item if we are validating # the connection details # ---------------------------------------------------------------------------- sub validate_connection_details { my $self = shift; my $name = shift; my $templ = shift; my $language = shift; my $form = shift; if ( defined $form->{update_imap_0_connection_details} ) { my $something_changed = undef; if ( $form->{imap_hostname} && $form->{imap_hostname} =~ /^\S+/ ) { $templ->param( IMAP_connection_if_hostname_error => 0 ); if ( $self->config_( 'hostname' ) ne $form->{imap_hostname} ) { $self->config_( 'hostname', $form->{imap_hostname} ); $something_changed = 1; } } else { $templ->param( IMAP_connection_if_hostname_error => 1 ); } if ( $form->{imap_port} && $form->{imap_port} =~ m/^\d+$/ && $form->{imap_port} >= 1 && $form->{imap_port} < 65536 ) { if ( $self->config_( 'port' ) != $form->{imap_port} ) { $self->config_( 'port', $form->{imap_port} ); $something_changed = 1; } $templ->param( IMAP_connection_if_port_error => 0 ); } else { $templ->param( IMAP_connection_if_port_error => 1 ); } if ( $form->{imap_login} ) { if ( $self->config_( 'login' ) ne $form->{imap_login} ) { $self->config_( 'login', $form->{imap_login} ); $something_changed = 1; } $templ->param( IMAP_connection_if_login_error => 0 ); } else { $templ->param( IMAP_connection_if_login_error => 1 ); } if ( $form->{imap_password} ) { if ( $self->config_( 'password' ) ne $form->{imap_password} ) { $self->config_( 'password', $form->{imap_password} ); $something_changed = 1; } $templ->param( IMAP_connection_if_password_error => 0 ); } else { $templ->param( IMAP_connection_if_password_error => 1 ); } my $use_ssl_now = $self->config_( 'use_ssl' ); if ( $form->{imap_use_ssl} ) { $self->config_( 'use_ssl', 1 ); if ( ! $use_ssl_now ) { $something_changed = 1; } } else { $self->config_( 'use_ssl', 0 ); if ( $use_ssl_now ) { $something_changed = 1; } } if ( $something_changed ) { $self->log_( 1, 'Configuration has changed. Terminating any old connections.' ); $self->disconnect_folders__(); } } return; } # ---------------------------------------------------------------------------- # # validate_update_mailbox_list - Called by validate_item if we are supposed # to update our list of mailboxes # ---------------------------------------------------------------------------- sub validate_update_mailbox_list { my $self = shift; my $name = shift; my $templ = shift; my $language = shift; my $form = shift; if ( defined $form->{do_imap_4_update_mailbox_list} ) { $self->log_( 2, 'Trying to update the list of mailboxes' ); if ( $self->config_( 'hostname' ) && $self->config_( 'login' ) && $self->config_( 'login' ) && $self->config_( 'port' ) && $self->config_( 'password' ) ) { my $imap = $self->new_imap_client(); if ( defined $imap ) { @{$self->{mailboxes__}} = $imap->get_mailbox_list(); $imap->logout(); } else { my $error = $self->{imap_error}; if ( $error eq 'NO_CONNECT' ) { $templ->param( IMAP_update_list_failed => 'Failed to connect to server. Please check the host name and port and make sure you are online.' ); $self->log_( 0, 'Could not connect to server.' ); # TODO: should be language__{Imap_UpdateError2} } elsif ( $error eq 'NO_LOGIN' ) { $templ->param( IMAP_update_list_failed => 'Could not login. Verify your login name and password, please.' ); $self->log_( 0, 'Could not login.' ); # TODO: should be language__{Imap_UpdateError1} } } } else { $templ->param( IMAP_update_list_failed => 'Please configure the connection details first.' ); # TODO: should be language__{Imap_UpdateError3} } } return; } # ---------------------------------------------------------------------------- # # train_on_archive__ - Poorly supported method that will use all the mails # in all our output folders to train POPFile on a bunch # of pre-sorted messages. # ---------------------------------------------------------------------------- sub train_on_archive__ { my $self = shift; $self->log_( 0, "Training on existing archive." ); # Reset the folders hash and build it again. %{$self->{folders__}} = (); $self->build_folder_list__(); # eliminate all watched folders foreach my $folder ( keys %{$self->{folders__}} ) { if ( exists $self->{folders__}{$folder}{watched} ) { delete $self->{folders__}{$folder}; } } # Connect to server $self->connect_server__(); foreach my $folder ( keys %{$self->{folders__}} ) { my $bucket = $self->{folders__}{$folder}{output}; # Skip pseudobuckets and the INBOX next if $self->classifier()->is_pseudo_bucket( $self->api_session(), $bucket ); next if $folder eq 'INBOX'; my $imap = $self->{folders__}{$folder}{imap}; # Set uidnext value to 1. We will train on all messages. $imap->uid_next( $folder, 1 ); my @uids = $imap->get_new_message_list_unselected( $folder ); $self->log_( 0, "Training on " . ( scalar @uids ) . " messages in folder $folder to bucket $bucket." ); foreach my $msg ( @uids ) { my ( $ok, @lines ) = $imap->fetch_message_part( $msg, '' ); $imap->uid_next( $folder, $msg ); unless ( $ok ) { $self->log_( 0, "Could not fetch message $msg!" ); next; } my $file = $self->get_user_path_( 'imap.tmp' ); if ( open my $TMP, '>', $file ) { foreach ( @lines ) { print $TMP "$_\n"; } close $TMP; $self->classifier()->add_message_to_bucket( $self->api_session(), $bucket, $file ); $self->log_( 0, "Training on the message with UID $msg to bucket $bucket." ); unlink $file; } else { $self->log_( 0, "Cannot open temp file $file" ); next; } } } # Again, reset folders__ hash. %{$self->{folders__}} = (); # And disable training mode so we won't do this again the next time service is called. $self->config_( 'training_mode', 0 ); } # ---------------------------------------------------------------------------- # # new_imap_client - Create a new object of type Services::IMAP::Client, # connect to the server and logon. # # arguments: none. # returns: new Services::IMAP::Client object on success or undef on error # # The exact error is stored away in $self->{imap_error}. # The possible errors are: # * NO_LOGIN: login failed, wrong username/password # * NO_CONNECT: connection failed, have we got network access? Are we # using the correct hostname or port? should we use ssl or not? # ---------------------------------------------------------------------------- sub new_imap_client { my $self = shift; my $imap = Services::IMAP::Client->new( sub { $self->config_( @_ ) }, $self->{logger__}, sub { $self->global_config_( @_ ) }, ); if ( $imap ) { if ( $imap->connect() ) { if ( $imap->login() ) { return $imap; } else { $self->log_( 0, "Could not LOGIN." ); $self->{imap_error} = 'NO_LOGIN'; } } else { $self->log_( 0, "Could not CONNECT to server." ); $self->{imap_error} = 'NO_CONNECT'; } } else { $self->log_( 0, 'Could not create IMAP object!' ); $self->{imap_error} = 'NO_OBJECT'; } return; } 1; popfile-1.1.3+dfsg/Services/IMAP/0000775000175000017500000000000011710356074015662 5ustar danieldanielpopfile-1.1.3+dfsg/Services/IMAP/Client.pm0000664000175000017500000007035211710356074017445 0ustar danieldaniel# ---------------------------------------------------------------------------- # # Services::IMAP::Client--- Helper module for the POPFile IMAP module # # Copyright (c) 2001-2011 John Graham-Cumming # # $Revision: 3680 $ # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Originally created by Manni Heumann (mannih2001@users.sourceforge.net) # Modified by Sam Schinke (sschinke@users.sourceforge.net) # Patches by David Lang (davidlang@users.sourceforge.net) # # ---------------------------------------------------------------------------- package Services::IMAP::Client; use base qw/ POPFile::Module /; use strict; use warnings; use IO::Socket; use Carp; my $eol = "\015\012"; my $cfg_separator = "-->"; # ---------------------------------------------------------------------------- # # new - Create a new IMAP client object # # IN: two subroutine refs and an integer # config -> reference to the config_ sub # log -> reference to logger module # global_config -> reference to the global_config_ sub # # OUT: a blessed object or undef if the config hash was incomplete # ---------------------------------------------------------------------------- sub new { my $class = shift; my $config = shift; my $log = shift; my $global_config = shift; my $self = bless {}, $class; # This is needed when the client module is run in POPFile 0.22.2 context $self->{logger__} = $log or return; # And this one is for the 0.23 (aka 2.0) context: $self->{modules__}{logger} = $log; $self->{config__} = $config or return; $self->{global_config__} = $global_config or return; $self->{host} = $self->config_( 'hostname' ); $self->{port} = $self->config_( 'port' ); $self->{login} = $self->config_( 'login' ); $self->{pass} = $self->config_( 'password' ); $self->{ssl} = $self->config_( 'use_ssl' ); $self->{timeout} = $self->global_config_( 'timeout' ); $self->{cutoff} = $self->global_config_( 'message_cutoff' ); $self->{socket} = undef; $self->{folder} = undef; $self->{tag} = 0; $self->{name__} = 'IMAP-Client'; return $self; } # ---------------------------------------------------------------------------- # # config_ - Replacement for POPFile::Module::config_ # ---------------------------------------------------------------------------- sub config_ { my $self = shift; return &{$self->{config__}}( @_ ); } # ---------------------------------------------------------------------------- # # global_config_ - Replacement for POPFile::Module::global_config_ # ---------------------------------------------------------------------------- sub global_config_ { my $self = shift; return &{$self->{global_config__}}( @_ ); } # ---------------------------------------------------------------------------- # # connect - Connect to the IMAP server. # # IN: - # OUT: true on success # undef on error # ---------------------------------------------------------------------------- sub connect { my $self = shift; my $hostname = $self->{host}; my $port = $self->{port}; my $use_ssl = $self->{ssl}; my $timeout = $self->{timeout}; $self->log_( 1, "Connecting to $hostname:$port" ); if ( $hostname ne '' && $port ne '' ) { my $response = ''; my $imap; if ( $use_ssl ) { require IO::Socket::SSL; $imap = IO::Socket::SSL->new ( Proto => "tcp", PeerAddr => $hostname, PeerPort => $port, Timeout => $timeout, Domain => AF_INET, ) or $self->log_(0, "IO::Socket::SSL error: $@"); } else { $imap = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $hostname, PeerPort => $port, Timeout => $timeout, ) or $self->log_(0, "IO::Socket::INET error: $@"); } # Check that the connect succeeded for the remote server if ( $imap ) { if ( $imap->connected ) { # Set binmode on the socket so that no translation of CRLF # occurs binmode( $imap ) if $use_ssl == 0; # Wait for a response from the remote server and if # there isn't one then give up trying to connect my $selector = IO::Select->new( $imap ); unless ( () = $selector->can_read( $timeout ) ) { $self->log_( 0, "Connection timed out for $hostname:$port" ); return; } $self->log_( 0, "Connected to $hostname:$port timeout $timeout" ); # Read the response from the real server my $buf = $self->slurp_( $imap ); $self->log_( 1, ">> $buf" ); $self->{socket} = $imap; return 1; } } } else { $self->log_( 0, "Invalid port or hostname. Will not connect to server." ); return; } } # ---------------------------------------------------------------------------- # # login - Login on the IMAP server. # # IN: - # OUT: true on success # undef on error # ---------------------------------------------------------------------------- sub login { my $self = shift; my $login = $self->{login}; my $pass = $self->{pass}; $self->log_( 1, "Logging in" ); $self->say( 'LOGIN "' . $login . '" "' . $pass . '"' ); if ( $self->get_response() == 1 ) { return 1; } else { return; } } # ---------------------------------------------------------------------------- # # noop - Do a NOOP on the server. Whatever that might be good for. # # IN: - # OUT: see get_response() # ---------------------------------------------------------------------------- sub noop { my $self = shift; $self->say( 'NOOP' ); my $result = $self->get_response(); $self->log_( 0, "NOOP failed (return value $result)" ) unless $result == 1; return $result; } # ---------------------------------------------------------------------------- # # status - Do a STATUS on the server, asking for UIDNEXT and UIDVALIDITY # information. # # IN: $folder - name of the mailbox to be STATUSed # OUT: hashref with the keys UIDNEXT and UIDVALIDITY # ---------------------------------------------------------------------------- sub status { my $self = shift; my $folder = shift; my $ret = { UIDNEXT => undef, UIDVALIDITY => undef }; $self->say( "STATUS \"$folder\" (UIDNEXT UIDVALIDITY)" ); if ( $self->get_response() == 1 ) { my @lines = split /$eol/, $self->{last_response}; foreach ( @lines ) { if ( /^\* STATUS/ ) { if ( /UIDNEXT (\d+)/ ) { $ret->{UIDNEXT} = $1; } if ( /UIDVALIDITY (\d+)/ ) { $ret->{UIDVALIDITY} = $1; } } last; } } else { # TODO: what now? } foreach ( keys %$ret ) { if ( ! defined $ret->{$_}) { $self->log_( 0, "Could not get $_ STATUS for folder $folder." ); } } return $ret; } # ---------------------------------------------------------------------------- # # DESTROY - Destructor called by Perl # # Will close the socket if it's connected. # TODO: This method could be friendly and try to logout first. OTOH, we # might no longer be logged in. # # ---------------------------------------------------------------------------- sub DESTROY { my $self = shift; $self->log_( 1, "IMAP-Client is exiting" ); $self->{socket}->shutdown( 2 ) if defined $self->{socket}; } # ---------------------------------------------------------------------------- # # expunge - Issue an EXPUNGE command. We need to be in a SELECTED state for # this to work. # # IN: - # OUT: see get_response() # ---------------------------------------------------------------------------- sub expunge { my $self = shift; $self->say( 'EXPUNGE' ); $self->get_response(); } # ---------------------------------------------------------------------------- # # say - Say something to the server. This method will also provide a valid # tag and a nice line ending. # # IN: $command - String containing the command # OUT: true und success, undef on error # ---------------------------------------------------------------------------- sub say { my $self = shift; my $command = shift; $self->{last_command} = $command; my $tag = $self->{tag}; my $cmdstr = sprintf "A%05d %s%s", $tag, $command, $eol; # Talk to the server unless( print {$self->{socket}} $cmdstr ) { $self->bail_out( "Lost connection while I tried to say '$cmdstr'." ); } # Log command # Obfuscate login and password for logins: $cmdstr =~ s/^(A\d+) LOGIN ".+?" ".+"(.+)/$1 LOGIN "xxxxx" "xxxxx"$2/; $self->log_( 1, "<< $cmdstr" ); return 1; } # ---------------------------------------------------------------------------- # # get_response # # Get a response from our server. You should normally not need to call this function # directly. Use get_response__ instead. # # Arguments: # # $imap: A valid socket object # $last_command: The command we are issued before. # $tag_ref: A reference to a scalar that will receive tag value that can be # used to tag the next command # $response_ref: A reference to a scalar that will receive the servers response. # # Return value: # undef lost connection # 1 Server answered OK # 0 Server answered NO # -1 Server answered BAD # -2 Server gave unexpected tagged answer # -3 Server didn't say anything, but the connection is still valid (I guess this cannot happen) # # ---------------------------------------------------------------------------- sub get_response { my $self = shift; my $imap = $self->{socket}; local $SIG{ALRM} = sub { alarm 0; $self->bail_out( "The connection to the IMAP server timed out while we waited for a response." ); }; alarm $self->global_config_( 'timeout' ); # What is the actual tag we have to look for? my $actual_tag = sprintf "A%05d", $self->{tag}; my $response = ''; my $count_octets = 0; my $octet_count = 0; # Slurp until we find a reason to quit while ( my $buf = $self->slurp_( $imap ) ) { # Check for lost connections: if ( $response eq '' && ! defined $buf ) { $self->bail_out( "The connection to the IMAP server was lost while trying to get a response to command '$self->{last_command}'." ); } # If this is the first line of the response and # if we find an octet count in curlies before the # newline, then we will rely on the octet count if ( $response eq '' && $buf =~ m/{(\d+)}$eol/ ) { # Add the length of the first line to the # octet count provided by the server $count_octets = $1 + length( $buf ); } $response .= $buf; if ( $count_octets ) { $octet_count += length $buf; # There doesn't seem to be a requirement for the message to end with # a newline. So we cannot go for equality if ( $octet_count >= $count_octets ) { $count_octets = 0; } $self->log_( 2, ">> $buf" ); } # If we aren't counting octets (anymore), we look out for tag # followed by BAD, NO, or OK and we also keep an eye open # for untagged responses that the server might send us unsolicited if ( $count_octets == 0 ) { if ( $buf =~ /^$actual_tag (OK|BAD|NO)/ ) { if ( $1 ne 'OK' ) { $self->log_( 0, ">> $buf" ); } else { $self->log_( 1, ">> $buf" ); } last; } # Here we look for untagged responses and decide whether they are # solicited or not based on the last command we gave the server. if ( $buf =~ /^\* (.+)/ ) { my $untagged_response = $1; $self->log_( 1, ">> $buf" ); # This should never happen, but under very rare circumstances, # we might get a change of the UIDVALIDITY value while we # are connected if ( $untagged_response =~ /UIDVALIDITY/ && ( $self->{last_command} !~ /^SELECT/ && $self->{last_command} !~ /^STATUS/ ) ) { $self->log_( 0, "Got unsolicited UIDVALIDITY response from server while reading response for $self->{last_command}." ); } # This could happen, but will be caught by the eval in service(). # Nevertheless, we look out for unsolicited bye-byes here. if ( $untagged_response =~ /^BYE/ && $self->{last_command} !~ /^LOGOUT/ ) { $self->log_( 0, "Got unsolicited BYE response from server while reading response for $self->{last_command}." ); } } } } # save result away so we can always have a look later on $self->{last_response} = $response; alarm 0; # Increment tag for the next command/reply sequence: $self->{tag}++; if ( $response ) { # determine our return value # We got 'OK' and the correct tag. if ( $response =~ /^$actual_tag OK/m ) { return 1; } # 'NO' plus correct tag elsif ( $response =~ /^$actual_tag NO/m ) { return 0; } # 'BAD' and correct tag. elsif ( $response =~ /^$actual_tag BAD/m ) { return -1; } # Someting else, probably a different tag, but who knows? else { $self->log_( 0, "!!! Server said something unexpected !!!" ); return -2; } } else { $self->bail_out( "The connection to the IMAP server was lost while trying to get a response to command '$self->{last_command}'" ); } } # ---------------------------------------------------------------------------- # # select # # Do a SELECT on the passed-in folder. Returns the result of get_response() # # Arguments: # $folder: The name of a mailbox on the server # # Return value: # # INT 1 is ok, everything else is an error # ---------------------------------------------------------------------------- sub select { my $self = shift; my $folder = shift; $self->say( "SELECT \"$folder\"" ); my $result = $self->get_response(); if ( $result == 1 ) { $self->{folder} = $folder; } return $result } # ---------------------------------------------------------------------------- # # get_mailbox_list # # Request a list of mailboxes from the server behind the passed in socket object. # The list is sorted and returned # # Arguments: none # # Return value: list of mailboxes, possibly emtpy (or error) # ---------------------------------------------------------------------------- sub get_mailbox_list { my $self = shift; $self->log_( 1, "Getting mailbox list" ); $self->say( 'LIST "" "*"' ); my $result = $self->get_response(); if ( $result != 1 ) { $self->log_( 0, "LIST command failed (return value [$result])." ); return; } my @lines = split /$eol/, $self->{last_response}; my @mailboxes; foreach ( @lines ) { next unless /^\*/; s/^\* LIST \(.*\) .+? (.+)$/$1/; s/"(.*?)"/$1/; push @mailboxes, $1; } return sort @mailboxes; } # ---------------------------------------------------------------------------- # # logout # # log out of the the server we are currently connected to. # # Arguments: none # # Return values: # 0 on failure # 1 on success # ---------------------------------------------------------------------------- sub logout { my $self = shift; $self->log_( 1, "Logging out" ); $self->say( 'LOGOUT' ); if ( $self->get_response() == 1 ) { $self->{socket}->shutdown( 2 ); $self->{folder} = undef; $self->{socket} = undef; return 1; } else { return 0; } } # ---------------------------------------------------------------------------- # # move_message # # Will try to move a message on the IMAP server. # # arguments: # # $msg: # The UID of the message # $destination: # The destination folder. # # ---------------------------------------------------------------------------- sub move_message { my $self = shift; my $msg = shift; my $destination = shift; $self->log_( 1, "Moving message $msg to $destination" ); # Copy message to destination $self->say( "UID COPY $msg \"$destination\"" ); my $ok = $self->get_response(); # If that went well, flag it as deleted if ( $ok == 1 ) { $self->say( "UID STORE $msg +FLAGS (\\Deleted)" ); $ok = $self->get_response(); } else { $self->log_( 0, "Could not copy message ($ok)!" ); } return ( $ok ? 1 : 0 ); } # ---------------------------------------------------------------------------- # # get_new_message_list # # Will search for messages on the IMAP server that are not flagged as deleted # that have a UID greater than or equal to the value stored as UIDNEXTfor # the currently SELECTed folder. # # arguments: none # # return value: # # A sorted list (possibly empty) of the UIDs of matching messages. # # ---------------------------------------------------------------------------- sub get_new_message_list { my $self = shift; my $folder = $self->{folder}; my $uid = $self->uid_next( $folder ); $self->log_( 1, "Getting uids ge $uid in folder $folder" ); $self->say( "UID SEARCH UID $uid:* UNDELETED" ); my $result = $self->get_response(); if ( $result != 1 ) { $self->log_( 0, "SEARCH command failed (return value: $result, used UID was [$uid])!" ); } # The server will respond with an untagged search reply. # This can either be empty ("* SEARCH") or if a # message was found it contains the numbers of the matching # messages, e.g. "* SEARCH 2 5 9". # In the latter case, the regexp below will match and # capture the list of messages in $1 my @matching = (); if ( $self->{last_response} =~ /\* SEARCH (.+)$eol/ ) { @matching = split / /, $1; } my @return_list = (); # Make sure that the UIDs reported by the server are really greater # than or equal to our passed in comparison value foreach my $num ( @matching ) { if ( $num >= $uid ) { push @return_list, $num; } } return ( sort { $a <=> $b } @return_list ); } # ---------------------------------------------------------------------------- # # get_new_message_list_unselected # # If we are not in the selected state, you can use this routine to get a list # of new messages on the server in a specific mailbox. # The routine will do a STATUS (UIDNEXT) and compare our old # UIDNEXT value to the new one. # If it turns out that the new value is larger than the old, the mailbox # is selected and the list of new UIDs gets retrieved. In that case, # we will remain in a selected state. # # arguments: $folder - the folder that should be examined # returns: see get_new_message_list # ---------------------------------------------------------------------------- sub get_new_message_list_unselected { my $self = shift; my $folder = shift; my $last_known = $self->uid_next( $folder ); my $info = $self->status( $folder ); if ( ! defined $info ) { $self->bail_out( "Could not get a valid response to the STATUS command." ); } else { my $new_next = $info->{UIDNEXT}; my $new_vali = $info->{UIDVALIDITY}; if ( $new_vali != $self->uid_validity( $folder ) ) { $self->log_( 0, "The folder $folder has a new UIDVALIDTIY value! Skipping new messages (if any)." ); $self->uid_validity( $folder, $new_vali ); return; } if ( $last_known < $new_next ) { $self->select( $folder ); return $self->get_new_message_list(); } } return; } # ---------------------------------------------------------------------------- # # fetch_message_part # # This function will fetch a specified part of a specified message from # the IMAP server and return the message as a list of lines. # It assumes that a folder is already SELECTed # # arguments: # # $msg: UID of the message # $part: The part of the message you want to fetch. Could be 'HEADER' for the # message headers, 'TEXT' for the body (including any attachments), or '' to # fetch the complete message. Other values are also possible, but currently # not used. 'BODYSTRUCTURE' could be interesting. # # return values: # # a boolean value indicating success/fallure and # a list containing the lines of the retrieved message (part). # # ---------------------------------------------------------------------------- sub fetch_message_part { my $self = shift; my $msg = shift; my $part = shift; my $folder = $self->{folder}; if ( $part ne '' ) { $self->log_( 1, "Fetching $part of message $msg" ); } else { $self->log_( 1, "Fetching message $msg" ); } if ( $part eq 'TEXT' || $part eq '' ) { my $limit = $self->{cutoff} || 0; $self->say( "UID FETCH $msg (FLAGS BODY.PEEK[$part]<0.$limit>)" ); } else { $self->say( "UID FETCH $msg (FLAGS BODY.PEEK[$part])" ); } my $result = $self->get_response(); if ( $part ne '' ) { $self->log_( 1, "Got $part of message # $msg, result: $result." ); } else { $self->log_( 1, "Got message # $msg, result: $result." ); } if ( $result == 1 ) { my @lines = (); # The first line now MUST start with "* x FETCH" where x is a message # sequence number anything else indicates that something went wrong # or that something changed. E.g. the message we wanted # to fetch is no longer there. my $last_response = $self->{last_response}; if ( $last_response =~ m/\^* \d+ FETCH/ ) { # The first line should contain the number of octets the server send us if ( $last_response =~ m/(?!$eol){(\d+)}$eol/ ) { my $num_octets = $1; # Grab the number of octets reported: my $pos = index $last_response, "{$num_octets}$eol"; $pos += length "{$num_octets}$eol"; my $message = substr $last_response, $pos, $num_octets; # Take the large chunk and chop it into single lines # We cannot use split here, because this would get rid of # trailing and leading newlines and thus omit complete lines. while ( $message =~ m/(.*?(?:$eol|\012|\015))/g ) { push @lines, $1; } } # No number of octets: fall back, but issue a warning else { while ( $last_response =~ m/(.*?(?:$eol|\012|\015))/g ) { push @lines, $1; } # discard the first and the two last lines; these are server status responses. shift @lines; pop @lines; pop @lines; $self->log_( 0, "Could not find octet count in server's response!" ); } } else { $self->log_( 0, "Unexpected server response to the FETCH command!" ); } return 1, @lines; } else { return 0; } } #--------------------------------------------------------------------------------------------- # # uid_validity # # Get the stored UIDVALIDITY value for the passed-in folder # or pass in new UIDVALIDITY value to store the value # # arguments: $folder [, $new_uidvalidity_value] # returns: the stored UIDVALIDITY value or undef if no value was stored previously #--------------------------------------------------------------------------------------------- sub uid_validity { my $self = shift; my $folder = shift or confess "gimme a folder!"; my $uidval = shift; my $all = $self->config_( 'uidvalidities' ); my %hash; if ( defined $all ) { %hash = split /$cfg_separator/, $all; } # set if ( defined $uidval ) { $hash{$folder} = $uidval; $all = ''; while ( my ( $key, $value ) = each %hash ) { $all .= "$key$cfg_separator$value$cfg_separator"; } $self->config_( 'uidvalidities', $all ); $self->log_( 1, "Updated UIDVALIDITY value for folder $folder to $uidval." ); } # get else { if ( exists $hash{$folder} && $hash{$folder} =~ /^\d+$/ ) { return $hash{$folder}; } else { return undef; } } } #--------------------------------------------------------------------------------------------- # # uid_next # # Get the stored UIDNEXT value for the passed-in folder # or pass in a new UIDNEXT value to store the value # # arguments: $folder [, $new_uidnext_value] # returns: the stored UIDVALIDITY value or undef if no value was stored previously #--------------------------------------------------------------------------------------------- sub uid_next { my $self = shift; my $folder = shift or confess "I need a folder"; my $uidnext = shift; my $all = $self->config_( 'uidnexts' ); my %hash = (); if ( defined $all ) { %hash = split /$cfg_separator/, $all; } # set if ( defined $uidnext ) { $hash{$folder} = $uidnext; $all = ''; while ( my ( $key, $value ) = each %hash ) { $all .= "$key$cfg_separator$value$cfg_separator"; } $self->config_( 'uidnexts', $all ); $self->log_( 1, "Updated UIDNEXT value for folder $folder to $uidnext." ); } # get else { if ( exists $hash{$folder} && $hash{$folder} =~ /^\d+$/ ) { return $hash{$folder}; } return; } } # ---------------------------------------------------------------------------- # # check_uidvalidity - Compare the stored UIDVALIDITY value to the passed-in # value # # IN: $folder, $uidvalidity_value # OUT: true if the values are equal, undef otherwise # ---------------------------------------------------------------------------- sub check_uidvalidity { my $self = shift; my $folder = shift; my $new_val = shift; confess "check_uidvalidity needs a new uidvalidity!" unless defined $new_val; confess "check_uidvalidity needs a folder name!" unless defined $folder; # Save old UIDVALIDITY value (if we have one) my $old_val = $self->uid_validity( $folder ); # Check whether the old value is still valid if ( $new_val != $old_val ) { return; } else { return 1; } } sub connected { my $self = shift; return $self->{socket} ? 1 : undef; } sub bail_out { my $self = shift; my $msg = shift; $self->{socket}->shutdown( 2 ) if defined $self->{socket}; $self->{socket} = undef; my ( $package, $filename, $line, $subroutine ) = caller(); $self->log_( 0, $msg ); die "POPFILE-IMAP-EXCEPTION: $msg ($filename ($line))"; } 1; popfile-1.1.3+dfsg/Proxy/0000775000175000017500000000000011710356074014472 5ustar danieldanielpopfile-1.1.3+dfsg/Proxy/NNTP.pm0000664000175000017500000006601711710356074015621 0ustar danieldaniel# POPFILE LOADABLE MODULE package Proxy::NNTP; use Proxy::Proxy; @ISA = ("Proxy::Proxy"); # ---------------------------------------------------------------------------- # # This module handles proxying the NNTP protocol for POPFile. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # # ---------------------------------------------------------------------------- use strict; use warnings; use locale; # A handy variable containing the value of an EOL for networks my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = Proxy::Proxy->new(); # Must call bless before attempting to call any methods bless $self, $type; $self->name( 'nntp' ); $self->{child_} = \&child__; $self->{connection_timeout_error_} = '500 no response from mail server'; $self->{connection_failed_error_} = '500 can\'t connect to'; $self->{good_response_} = '^(1|2|3)\d\d'; return $self; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the NNTP proxy module # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # Disabled by default $self->config_( 'enabled', 0 ); # By default we don't fork on Windows $self->config_( 'force_fork', ($^O eq 'MSWin32')?0:1 ); # Default ports for NNTP service and the user interface $self->config_( 'port', 119 ); # Only accept connections from the local machine for NNTP $self->config_( 'local', 1 ); # Whether to do classification on HEAD as well $self->config_( 'headtoo', 0 ); # The separator within the NNTP user name is : $self->config_( 'separator', ':'); # The welcome string from the proxy is configurable $self->config_( 'welcome_string', # PROFILE BLOCK START "NNTP POPFile ($self->{version_}) server ready" ); # PROFILE BLOCK STOP if ( !$self->SUPER::initialize() ) { return 0; } $self->config_( 'enabled', 0 ); return 1; } # ---------------------------------------------------------------------------- # # start # # Called to start the NNTP proxy module # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # If we are not enabled then no further work happens in this module if ( $self->config_( 'enabled' ) == 0 ) { return 2; } # Tell the user interface module that we having a configuration # item that needs a UI component $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START 'nntp_port', 'nntp-port.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START 'nntp_force_fork', 'nntp-force-fork.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START 'nntp_separator', 'nntp-separator.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'security', # PROFILE BLOCK START 'nntp_local', 'nntp-security-local.thtml', $self ); # PROFILE BLOCK STOP if ( $self->config_( 'welcome_string' ) =~ # PROFILE BLOCK START /^NNTP POPFile \(v\d+\.\d+\.\d+\) server ready$/ ) { # PROFILE BLOCK STOP $self->config_( 'welcome_string', # PROFILE BLOCK START "NNTP POPFile ($self->{version_}) server ready" ); # PROFILE BLOCK STOP } return $self->SUPER::start();; } # ---------------------------------------------------------------------------- # # child__ # # The worker method that is called when we get a good connection from a client # # $client - an open stream to a NNTP client # $session - API session key # # ---------------------------------------------------------------------------- sub child__ { my ( $self, $client, $session ) = @_; # Hash of indexes of downloaded messages mapped to their # slot IDs my %downloaded; # The handle to the real news server gets stored here my $news; # The state of the connection (username needed, password needed, # authenticated/connected) my $connection_state = 'username needed'; # Tell the client that we are ready for commands and identify our # version number $self->tee_( $client, "201 " . $self->config_( 'welcome_string' ) . # PROFILE BLOCK START "$eol" ); # PROFILE BLOCK STOP # Retrieve commands from the client and process them until the # client disconnects or we get a specific QUIT command while ( <$client> ) { my $command; my ( $response, $ok ); $command = $_; # Clean up the command so that it has a nice clean $eol at the end $command =~ s/(\015|\012)//g; $self->log_( 2, "Command: --$command--" ); # The news client wants to stop using the server, so send that # message through to the real news server, echo the response # back up to the client and exit the while. We will close the # connection immediately if ( $command =~ /^ *QUIT/i ) { if ( $news ) { last if ( $self->echo_response_( $news, $client, $command ) == # PROFILE BLOCK START 2 ); # PROFILE BLOCK STOP close $news; } else { $self->tee_( $client, "205 goodbye$eol" ); } last; } if ( $connection_state eq 'username needed' ) { # NOTE: This syntax is ambiguous if the NNTP username is a # short (under 5 digit) string (eg, 32123). If this is # the case, run "perl popfile.pl -nntp_separator /" and # change your kludged username appropriately (syntax would # then be server[:port][/username]) my $separator = $self->config_( 'separator' ); my $user_command = "^ *AUTHINFO USER ([^:]+)(:([\\d]{1,5}))?(\Q$separator\E(.+))?"; if ( $command =~ /$user_command/i ) { my $server = $1; # hey, the port has to be in range at least my $port = $3 if ( defined($3) && ($3 > 0) && ($3 < 65536) ); my $username = $5; if ( $server ne '' ) { if ( $news = $self->verify_connected_( $news, $client, # PROFILE BLOCK START $server, $port || 119 ) ) { # PROFILE BLOCK STOP if ( defined $username ) { # Pass through the AUTHINFO command with # the actual user name for this server, if # one is defined, and send the reply # straight to the client $self->get_response_( $news, $client, # PROFILE BLOCK START 'AUTHINFO USER ' . $username ); # PROFILE BLOCK STOP $connection_state = "password needed"; } else { # Signal to the client to send the password $self->tee_($client, "381 password$eol"); $connection_state = "ignore password"; } } else { last; } } else { $self->tee_( $client, # PROFILE BLOCK START "482 Authentication rejected server name not specified in AUTHINFO USER command$eol" ); # PROFILE BLOCK STOP last; } $self->flush_extra_( $news, $client, 0 ); } else { # Issue a 480 authentication required response $self->tee_( $client, "480 Authorization required for this command$eol" ); } next; } if ( $connection_state eq "password needed" ) { if ( $command =~ /^ *AUTHINFO PASS (.*)/i ) { ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command ); # PROFILE BLOCK STOP if ( $response =~ /^281 .*/ ) { $connection_state = "connected"; } } else { # Issue a 381 more authentication required response $self->tee_( $client, "381 more authentication required for this command$eol" ); } next; } if ( $connection_state eq "ignore password" ) { if ( $command =~ /^ *AUTHINFO PASS (.*)/i ) { $self->tee_( $client, "281 authentication accepted$eol" ); $connection_state = "connected"; } else { # Issue a 480 authentication required response $self->tee_( $client, "381 more authentication required for this command$eol" ); } next; } if ( $connection_state eq "connected" ) { my $message_id; # COMMANDS USED DIRECTLY WITH THE REMOTE NNTP SERVER GO HERE # The client wants to retrieve an article. We oblige, and # insert classification headers. if ( $command =~ /^ *ARTICLE ?(.*)?/i ) { my $file; if ( $1 =~ /^\d*$/ ) { ( $message_id, $response ) = # PROFILE BLOCK START $self->get_message_id_( $news, $client, $command ); # PROFILE BLOCK STOP if ( !defined( $message_id ) ) { $self->tee_( $client, $response ); next; } } else { $message_id = $1; } if ( defined($downloaded{$message_id}) && # PROFILE BLOCK START ( $file = $self->{history__}->get_slot_file( $downloaded{$message_id}{slot} ) ) && ( open RETRFILE, "<$file" ) ) { # PROFILE BLOCK STOP # Act like a network stream binmode RETRFILE; # File has been fetched and classified already $self->log_( 1, "Printing message from cache" ); # Give the client 220 (ok) $self->tee_( $client, "220 0 $message_id$eol" ); # Echo file, inserting known classification, # without saving ( my $class, undef ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, \*RETRFILE, $client, 1, $downloaded{$message_id}{class}, $downloaded{$message_id}{slot} ); # PROFILE BLOCK STOP print $client ".$eol"; close RETRFILE; } else { ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command ); # PROFILE BLOCK STOP if ( $response =~ /^220 +(\d+) +([^ \015]+)/i ) { $message_id = $2; my ( $class, $history_file ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, $news, $client, 0, '', 0 ); # PROFILE BLOCK STOP $downloaded{$message_id}{slot} = $history_file; $downloaded{$message_id}{class} = $class; } } next; } if ( $command =~ /^ *HEAD ?(.*)?/i ) { if ( $1 =~ /^\d*$/ ) { ( $message_id, $response ) = # PROFILE BLOCK START $self->get_message_id_( $news, $client, $command ); # PROFILE BLOCK STOP if ( !defined( $message_id ) ) { $self->tee_( $client, $response ); next; } } else { $message_id = $1; } if ( $self->config_( 'headtoo' ) ) { my ( $class, $history_file ); my $cached = 0; if ( defined($downloaded{$message_id}) ) { # Already cached $cached = 1; $class = $downloaded{$message_id}{class}; $history_file = $downloaded{$message_id}{slot}; } else { # Send ARTICLE command to server my $article_command = $command; $article_command =~ s/^ *HEAD/ARTICLE/i; ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $article_command, 0, 1 ); # PROFILE BLOCK STOP if ( $response =~ /^220 +(\d+) +([^ \015]+)/i ) { $message_id = $2; $response =~ s/^220/221/; $self->tee_( $client, "$response" ); # Classify without sending to client ( $class, $history_file ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, $news, undef, 0, '', 0, 0 ); # PROFILE BLOCK STOP $downloaded{$message_id}{slot} = $history_file; $downloaded{$message_id}{class} = $class; } else { $self->tee_( $client, "$response" ); next; } } # Send header to client from server ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command, 0, ( $cached ? 0 : 1 ) ); # PROFILE BLOCK STOP if ( $response =~ /^221 +(\d+) +([^ ]+)/i ) { $self->{classifier__}->classify_and_modify( # PROFILE BLOCK START $session, $news, $client, 1, $class, $history_file, 1 ); # PROFILE BLOCK STOP } next; } } if ( $command =~ /^ *BODY ?(.*)?/i ) { my $file; if ( $1 =~ /^\d*$/ ) { ( $message_id, $response ) = # PROFILE BLOCK START $self->get_message_id_( $news, $client, $command ); # PROFILE BLOCK STOP if ( !defined( $message_id ) ) { $self->tee_( $client, $response ); next; } } else { $message_id = $1; } if ( defined($downloaded{$message_id}) && # PROFILE BLOCK START ( $file = $self->{history__}->get_slot_file( $downloaded{$message_id}{slot} ) ) && ( open RETRFILE, "<$file" ) ) { # PROFILE BLOCK STOP # Act like a network stream binmode RETRFILE; # File has been fetched and classified already $self->log_( 1, "Printing message from cache" ); # Give the client 222 (ok) $self->tee_( $client, "222 0 $message_id$eol" ); # Skip header while ( my $line = $self->slurp_( \*RETRFILE ) ) { last if ( $line =~ /^[\015\012]+$/ ); } # Echo file to client $self->echo_to_dot_( \*RETRFILE, $client ); print $client ".$eol"; close RETRFILE; } else { # Send ARTICLE command to server my $article_command = $command; $article_command =~ s/^ *BODY/ARTICLE/i; ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $article_command, 0, 1 ); # PROFILE BLOCK STOP if ( $response =~ /^220 +(\d+) +([^ \015]+)/i ) { $message_id = $2; $response =~ s/^220/222/; $self->tee_( $client, "$response" ); # Classify without sending to client my ( $class, $history_file ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, $news, undef, 0, '', 0, 0 ); # PROFILE BLOCK STOP $downloaded{$message_id}{slot} = $history_file; $downloaded{$message_id}{class} = $class; # Send body to client from server ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command, 0, 1 ); # PROFILE BLOCK STOP if ( $response =~ /^222 +(\d+) +([^ ]+)/i ) { $self->echo_to_dot_( $news, $client, 0 ); } } else { $self->tee_( $client, "$response" ); } } next; } # Commands expecting a code + text response if ( $command =~ # PROFILE BLOCK START /^[ ]*(LIST|HEAD|NEWGROUPS|NEWNEWS|LISTGROUP|XGTITLE|XINDEX|XHDR| XOVER|XPAT|XROVER|XTHREAD)/ix ) { # PROFILE BLOCK STOP ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command ); # PROFILE BLOCK STOP # 2xx (200) series response indicates multi-line text # follows to .crlf if ( $response =~ /^2\d\d/ ) { $self->echo_to_dot_( $news, $client, 0 ); } next; } # Exceptions to 200 code above if ( $ command =~ /^ *(HELP)/i ) { ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command ); # PROFILE BLOCK STOP if ( $response =~ /^1\d\d/ ) { $self->echo_to_dot_( $news, $client, 0 ); } next; } # Commands expecting a single-line response if ( $command =~ # PROFILE BLOCK START /^ *(GROUP|STAT|IHAVE|LAST|NEXT|SLAVE|MODE|XPATH)/i ) { # PROFILE BLOCK STOP $self->get_response_( $news, $client, $command ); next; } # Commands followed by multi-line client response if ( $command =~ /^ *(IHAVE|POST|XRELPIC)/i ) { ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command ); # PROFILE BLOCK STOP # 3xx (300) series response indicates multi-line text # should be sent, up to .crlf if ( $response =~ /^3\d\d/ ) { # Echo from the client to the server $self->echo_to_dot_( $client, $news, 0 ); # Echo to dot doesn't provoke a server response # somehow, we add another CRLF $self->get_response_( $news, $client, "$eol" ); } else { $self->tee_( $client, $response ); } next; } } # Commands we expect no response to, such as the null command if ( $ command =~ /^ *$/ ) { if ( $news && $news->connected ) { $self->get_response_( $news, $client, $command, 1 ); next; } } # Don't know what this is so let's just pass it through and # hope for the best if ( $news && $news->connected ) { $self->echo_response_( $news, $client, $command ); next; } else { $self->tee_( $client, "500 unknown command or bad syntax$eol" ); last; } } if ( defined( $news ) ) { $self->done_slurp_( $news ); close $news; } close $client; $self->mq_post_( 'CMPLT', $$ ); $self->log_( 0, "NNTP proxy done" ); } # ---------------------------------------------------------------------------- # # configure_item # # $name Name of this item # $templ The loaded template that was passed as a parameter # when registering # $language Current language # # ---------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $templ, $language ) = @_; if ( $name eq 'nntp_port' ) { $templ->param( 'nntp_port' => $self->config_( 'port' ) ); return; } # Separator Character widget if ( $name eq 'nntp_separator' ) { $templ->param( 'nntp_separator' => $self->config_( 'separator' ) ); return; } if ( $name eq 'nntp_local' ) { $templ->param( 'nntp_if_local' => $self->config_( 'local' ) ); return; } if ( $name eq 'nntp_force_fork' ) { $templ->param( 'nntp_force_fork_on' => $self->config_( 'force_fork' ) ); return; } $self->SUPER::configure_item( $name, $templ, $language ); } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by # the call to register_configuration_item # $templ The loaded template # $language The language currently in use # $form Hash containing all form items # # ---------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $templ, $language, $form ) = @_; if ( $name eq 'nntp_port' ) { if ( defined $$form{nntp_port} ) { if ( ( $$form{nntp_port} =~ /^\d+$/ ) && # PROFILE BLOCK START ( $$form{nntp_port} >= 1 ) && ( $$form{nntp_port} <= 65535 ) ) { # PROFILE BLOCK STOP $self->config_( 'port', $$form{nntp_port} ); $templ->param( 'nntp_port_feedback' => sprintf $$language{Configuration_NNTPUpdate}, $self->config_( 'port' ) ); } else { $templ->param( 'nntp_port_feedback' => "
$$language{Configuration_Error3}
" ); } } return; } if ( $name eq 'nntp_separator' ) { if ( defined $$form{nntp_separator} ) { if ( length($$form{nntp_separator}) == 1 ) { $self->config_( 'separator', $$form{nntp_separator} ); $templ->param( 'nntp_separator_feedback' => sprintf $$language{Configuration_NNTPSepUpdate}, $self->config_( 'separator' ) ); } else { $templ->param( 'nntp_separator_feedback' => "
\n$$language{Configuration_Error1}
\n" ); } } return; } if ( $name eq 'nntp_local' ) { if ( defined $$form{nntp_local} ) { $self->config_( 'local', $$form{nntp_local} ); } return; } if ( $name eq 'nntp_force_fork' ) { if ( defined $$form{nntp_force_fork} ) { $self->config_( 'force_fork', $$form{nntp_force_fork} ); } return; } $self->SUPER::validate_item( $name, $templ, $language, $form ); } # ---------------------------------------------------------------------------- # # get_message_id_ # # Get message_id of the article to retrieve # # $news A connection to the news server # $client A connection from the news client # $command A command sent from the news client # # ---------------------------------------------------------------------------- sub get_message_id_ { my ( $self, $news, $client, $command ) = @_; # Send STAT command to get the message_id $command =~ s/^ *(ARTICLE|HEAD|BODY)/STAT/i; my ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $news, $client, $command, 0, 1 ); # PROFILE BLOCK STOP if ( $response =~ /^223 +(\d+) +([^ \015]+)/i ) { return ( $2, $response ); } else { return ( undef, $response ); } } 1; popfile-1.1.3+dfsg/Proxy/POP3.pm0000664000175000017500000007504311710356074015562 0ustar danieldaniel# POPFILE LOADABLE MODULE package Proxy::POP3; use Proxy::Proxy; use Digest::MD5; @ISA = ("Proxy::Proxy"); # ---------------------------------------------------------------------------- # # This module handles proxying the POP3 protocol for POPFile. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # # ---------------------------------------------------------------------------- use strict; use warnings; use locale; # A handy variable containing the value of an EOL for networks my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = Proxy::Proxy->new(); # Must call bless before attempting to call any methods bless $self, $type; $self->name( 'pop3' ); $self->{child_} = \&child__; $self->{connection_timeout_error_} = '-ERR no response from mail server'; $self->{connection_failed_error_} = '-ERR can\'t connect to'; $self->{good_response_} = '^\+OK'; # Client requested APOP $self->{use_apop__} = 0; # APOP username $self->{apop_user__} = ''; # The APOP portion of the banner sent by the POP3 server $self->{apop_banner__} = undef; return $self; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the POP3 proxy module # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # Enabled by default $self->config_( 'enabled', 1 ); # By default we don't fork on Windows $self->config_( 'force_fork', ($^O eq 'MSWin32')?0:1 ); # Default ports for POP3 service and the user interface $self->config_( 'port', 110 ); # There is no default setting for the secure server $self->config_( 'secure_server', '' ); $self->config_( 'secure_port', 110 ); # Only accept connections from the local machine for POP3 $self->config_( 'local', 1 ); # Whether to do classification on TOP as well $self->config_( 'toptoo', 0 ); # The separator within the POP3 username is : $self->config_( 'separator', ':' ); # The welcome string from the proxy is configurable $self->config_( 'welcome_string', # PROFILE BLOCK START "POP3 POPFile ($self->{version_}) server ready" ); # PROFILE BLOCK STOP return $self->SUPER::initialize(); } # ---------------------------------------------------------------------------- # # start # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # If we are not enabled then no further work happens in this module if ( $self->config_( 'enabled' ) == 0 ) { return 2; } # Tell the user interface module that we having a configuration # item that needs a UI component $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START 'pop3_configuration', 'pop3-configuration-panel.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'security', # PROFILE BLOCK START 'pop3_security', 'pop3-security-panel.thtml', $self ); # PROFILE BLOCK STOP $self->register_configuration_item_( 'chain', # PROFILE BLOCK START 'pop3_chain', 'pop3-chain-panel.thtml', $self ); # PROFILE BLOCK STOP if ( $self->config_( 'welcome_string' ) =~ # PROFILE BLOCK START /^POP3 POPFile \(v\d+\.\d+\.\d+\) server ready$/ ) { # PROFILE BLOCK STOP $self->config_( 'welcome_string', # PROFILE BLOCK START "POP3 POPFile ($self->{version_}) server ready" ); # PROFILE BLOCK STOP } return $self->SUPER::start(); } # ---------------------------------------------------------------------------- # # child__ # # The worker method that is called when we get a good connection from # a client # # $client - an open stream to a POP3 client # $session - API session key # # ---------------------------------------------------------------------------- sub child__ { my ( $self, $client, $session ) = @_; # Hash of indexes of downloaded messages mapped to their # slot IDs my %downloaded; # The handle to the real mail server gets stored here my $mail; $self->{apop_banner__} = undef; $self->{use_apop__} = 0; $self->{apop_user__} = ''; # Tell the client that we are ready for commands and identify our # version number $self->tee_( $client, "+OK " . $self->config_( 'welcome_string' ) . # PROFILE BLOCK START "$eol" ); # PROFILE BLOCK STOP # Compile some configurable regexp's once my $s = $self->config_( 'separator' ); $s =~ s/(\$|\@|\[|\]|\(|\)|\||\?|\*|\.|\^|\+)/\\$1/; my $transparent = "^USER ([^$s]+)\$"; my $user_command = "USER ([^$s]+)($s(\\d{1,5}))?$s([^$s]+)($s([^$s]+))?"; my $apop_command = "APOP ([^$s]+)($s(\\d{1,5}))?$s([^$s]+) (.*?)"; $self->log_( 2, "Regexps: $transparent, $user_command, $apop_command" ); # Retrieve commands from the client and process them until the # client disconnects or we get a specific QUIT command while ( <$client> ) { my $command; $command = $_; # Clean up the command so that it has a nice clean $eol at the # end $command =~ s/(\015|\012)//g; $self->log_( 2, "Command: --$command--" ); # The USER command is a special case because we modify the # syntax of POP3 a little to expect that the username being # passed is actually of the form host:username where host is # the actual remote mail server to contact and username is the # username to pass through to that server and represents the # account on the remote machine that we will pull email from. # Doing this means we can act as a proxy for multiple mail # clients and mail accounts # # When the client issues the command "USER host:username:apop" # POPFile must acknowledge the command and be prepared to # compute the md5 digest of the user's password and the real # pop server's banner upon receipt of a PASS command. # # When the client issues the command "USER host:username:ssl" # POPFile will use SSL for the connection to the remote, note # that the user can say host:username:ssl,apop if both are # needed if ( $command =~ /$transparent/i ) { if ( $self->config_( 'secure_server' ) ne '' ) { if ( $mail = $self->verify_connected_( $mail, $client, # PROFILE BLOCK START $self->config_( 'secure_server' ), $self->config_( 'secure_port' ) ) ) { # PROFILE BLOCK STOP last if ($self->echo_response_($mail, $client, $command) == 2 ); } else { next; } } else { $self->tee_( $client, "-ERR Transparent proxying not configured: set secure server/port ( command you sent: '$command' )$eol" ); } next; } if ( $command =~ /$user_command/i ) { if ( $1 ne '' ) { my ( $host, $port, $user, $options ) = ($1, $3, $4, $6); $self->mq_post_( 'LOGIN', $user ); my $ssl = defined( $options ) && ( $options =~ /ssl/i ); # We cannot use the concurrent POP3 connections with SSL on # Windows because one of SSL support modules (Net::SSLeay) is # not thread-safe. ActivePerl for Windows emulates fork() by # multiple threads. if ( $ssl && ( $^O eq 'MSWin32' ) && $self->config_( 'force_fork' ) ) { $self->tee_( $client, "-ERR On Windows, SSL support cannot be used with concurrent POP3 connections$eol" ); next; } $port = $ssl?995:110 if ( !defined( $port ) ); if ( $mail = $self->verify_connected_( $mail, $client, # PROFILE BLOCK START $host, $port, $ssl ) ) { # PROFILE BLOCK STOP if ( defined( $options ) && ( $options =~ /apop/i ) ) { # We want to make sure the server sent a real # APOP banner, containing <>'s $self->{apop_banner__} = $1 if $self->{connect_banner__} =~ /(<[^>]+>)/; $self->log_( 2, "banner=" . $self->{apop_banner__} ) if defined( $self->{apop_banner__} ); # any apop banner is ok if ( defined($self->{apop_banner__})) { $self->{use_apop__} = 1; # $self->log_( 2, "auth APOP" ); $self->{apop_user__} = $user; # tell the client that username was # accepted don't flush_extra, we didn't # send anything to the real server $self->tee_( $client, "+OK hello $user$eol" ); next; } else { # If the client asked for APOP, and the # server doesn't have the correct banner, # give a meaningful error instead of # whatever error the server might have if # we try to make up a hash $self->{use_apop__} = 0; $self->tee_( $client, "-ERR $host doesn't support APOP, aborting authentication$eol" ); next; } } else { # Pass through the USER command with the # actual user name for this server, and send # the reply straight to the client $self->log_( 2, "auth plaintext" ); $self->{use_apop__} = 0; # signifies a non-apop connection last if ($self->echo_response_( $mail, $client, 'USER ' . $user ) == 2 ); } } else { # If the login fails then we want to continue in # the unlogged in state so that clients can send # us the QUIT command next; } } next; } # User is issuing the APOP command to start a session with the # remote server if ( ( $command =~ /PASS (.*)/i ) ) { if ( $self->{use_apop__} ) { # Authenticate with APOP my $md5 = Digest::MD5->new; $md5->add( $self->{apop_banner__}, $1 ); my $md5hex = $md5->hexdigest; $self->log_( 2, "digest='$md5hex'" ); my ( $response, $ok ) = # PROFILE BLOCK START $self->get_response_( $mail, $client, "APOP $self->{apop_user__} $md5hex", 0, 1 ); # PROFILE BLOCK STOP if ( ( $ok == 1 ) && # PROFILE BLOCK START ( $response =~ /$self->{good_response_}/ ) ) { # PROFILE BLOCK STOP # authentication OK, toss the hello response and # return password ok $self->tee_( $client, "+OK password ok$eol" ); } else { $self->tee_( $client, $response ); } } else { last if ($self->echo_response_($mail, $client, $command) == 2 ); } next; } # User is issuing the APOP command to start a session with the # remote server. We'd need a copy of the plaintext password to # support this. if ( $command =~ /$apop_command/io ) { $self->tee_( $client, # PROFILE BLOCK START "-ERR APOP not supported between mail client and POPFile.$eol" ); # PROFILE BLOCK STOP # TODO: Consider implementing a host:port:username:secret # hash syntax for proxying the APOP command next; } # Secure authentication if ( $command =~ /AUTH ([^ ]+)/i ) { if ( $self->config_( 'secure_server' ) ne '' ) { if ( $mail = $self->verify_connected_( $mail, $client, # PROFILE BLOCK START $self->config_( 'secure_server' ), $self->config_( 'secure_port' ) ) ) { # PROFILE BLOCK STOP # Loop until we get -ERR or +OK my ( $response, $ok ) = $self->get_response_( $mail, $client, $command ); while ( ( ! ( $response =~ /\+OK/ ) ) && ( ! ( $response =~ /-ERR/ ) ) ) { my $auth; $auth = <$client>; $auth =~ s/(\015|\012)$//g; ( $response, $ok ) = $self->get_response_( $mail, $client, $auth ); } } else { next; } } else { $self->tee_( $client, "-ERR No secure server specified$eol" ); } next; } if ( $command =~ /AUTH/i ) { if ( $self->config_( 'secure_server' ) ne '' ) { if ( $mail = $self->verify_connected_( $mail, $client, # PROFILE BLOCK START $self->config_( 'secure_server' ), $self->config_( 'secure_port' ) ) ) { # PROFILE BLOCK STOP my $response = $self->echo_response_($mail, $client, "AUTH" ); last if ( $response == 2 ); if ( $response == 0 ) { $self->echo_to_dot_( $mail, $client ); } } else { next; } } else { $self->tee_( $client, "-ERR No secure server specified$eol" ); } next; } # The client is requesting a LIST/UIDL of the messages if ( ( $command =~ /LIST ?(.*)?/i ) || # PROFILE BLOCK START ( $command =~ /UIDL ?(.*)?/i ) ) { # PROFILE BLOCK STOP my $response = $self->echo_response_($mail, $client, $command ); last if ( $response == 2 ); if ( $response == 0 ) { $self->echo_to_dot_( $mail, $client ) if ( $1 eq '' ); } next; } # TOP handling is rather special because we have three cases # that we handle # # 1. If the client sends TOP x 99999999 then it is most likely # to be fetchmail and the intent of fetchmail is to # actually get the message but for its own reasons it does # not use RETR. We use RETR as the clue to place a message # in the history, so we have a hack. If the client looks # like fetchmail then TOP x 99999999 is actually # implemented using RETR # # 2. The toptoo configuration controls whether email # downloaded using the TOP command is classified or not (It # may be downloaded and cached for bandwidth efficiency, and # thus appear in the history). There are two cases: # # 2a If toptoo is 0 then POPFile will pass a TOP from the # client through as a TOP and do no classification on the # message. # # 2b If toptoo is 1 then POPFile first does a RETR on the # message and saves it in the history so that it can get the # classification on the message which is stores in $class. # Then it gets the message again by sending the TOP command # and passing the result through classify_and_modify passing # in the $class determined above. This means that the message # gets the right classification and the client only gets the # headers requested plus so many lines of body, but they will # get subject modification, and the XTC and XPL headers add. # Note that TOP always returns the full headers and then n # lines of the body so we are guaranteed to be able to do our # header modifications. # # NOTE messages retrieved using TOPTOO are visible in the # history as they are "cached" to avoid requiring repeated # downloads if the client issues a RETR for the message in # the same session # # NOTE using toptoo=1 on a slow link could cause # performance problems, in cases where only the headers, # but not classification, is required. toptoo=1 is, # however, appropriate for normal use via a mail client and # won't significantly increase bandwidth unless the mail # client is selectively downloading messages based on # non-classification data in the TOP headers. if ( $command =~ /TOP (.*) (.*)/i ) { my $count = $1; if ( $2 ne '99999999' ) { if ( $self->config_( 'toptoo' ) == 1 ) { my $response = # PROFILE BLOCK START $self->echo_response_( $mail, $client, "RETR $count" ); # PROFILE BLOCK STOP last if ( $response == 2 ); if ( $response == 0 ) { # Classify without echoing to client, saving # file for later RETR's my ( $class, $slot ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, $mail, $client, 0, '', 0, 0 ); # PROFILE BLOCK STOP $downloaded{$count}{slot} = $slot; $downloaded{$count}{class} = $class; # Note that the 1 here indicates that # echo_response_ does not send the response to # the client. The +OK has already been sent # by the RETR $response = # PROFILE BLOCK START $self->echo_response_( $mail, $client, $command, 1 ); # PROFILE BLOCK STOP last if ( $response == 2 ); if ( $response == 0 ) { # Classify with pre-defined class, without # saving, echoing to client $self->{classifier__}->classify_and_modify( # PROFILE BLOCK START $session, $mail, $client, 1, $class, $slot, 1 ); # PROFILE BLOCK STOP } } } else { my $response = # PROFILE BLOCK START $self->echo_response_( $mail, $client, $command ); # PROFILE BLOCK STOP last if ( $response == 2 ); if ( $response == 0 ) { $self->echo_to_dot_( $mail, $client ); } } next; } # Note the fall through here. Later down the page we look # for TOP x 99999999 and do a RETR instead } # The CAPA command if ( $command =~ /CAPA/i ) { if ( $mail || $self->config_( 'secure_server' ) ne '' ) { if ( $mail || ( $mail = $self->verify_connected_( $mail, $client, # PROFILE BLOCK START $self->config_( 'secure_server' ), $self->config_( 'secure_port' ) ) ) ) { # PROFILE BLOCK STOP my $response = $self->echo_response_($mail, $client, "CAPA" ); last if ( $response == 2 ); if ( $response == 0 ) { $self->echo_to_dot_( $mail, $client ); } } else { next; } } else { $self->tee_( $client, "-ERR No secure server specified$eol" ); } next; } # The HELO command results in a very simple response from us. # We just echo that we are ready for commands if ( $command =~ /HELO/i ) { $self->tee_( $client, "+OK HELO POPFile Server Ready$eol" ); next; } # In the case of PASS, NOOP, XSENDER, STAT, DELE and RSET # commands we simply pass it through to the real mail server # for processing and echo the response back to the client if ( ( $command =~ /NOOP/i ) || # PROFILE BLOCK START ( $command =~ /STAT/i ) || ( $command =~ /XSENDER (.*)/i ) || ( $command =~ /DELE (.*)/i ) || ( $command =~ /RSET/i ) ) { # PROFILE BLOCK STOP last if ( $self->echo_response_($mail, $client, $command ) == 2 ); next; } # The client is requesting a specific message. Note the # horrible hack here where we detect a command of the form TOP # x 99999999 this is done so that fetchmail can be used with # POPFile. if ( ( $command =~ /RETR (.*)/i ) || ( $command =~ /TOP (.*) 99999999/i ) ) { my $count = $1; my $class; my $file; if ( defined($downloaded{$count}) && # PROFILE BLOCK START ( $file = $self->{history__}->get_slot_file( $downloaded{$count}{slot} ) ) && ( open RETRFILE, "<$file" ) ) { # PROFILE BLOCK STOP # act like a network stream binmode RETRFILE; # File has been fetched and classified already $self->log_( 1, "Printing message from cache" ); # Give the client an +OK: $self->tee_( $client, "+OK " . ( -s $file ) . " bytes from POPFile cache$eol" ); # echo file, inserting known classification, # without saving ( $class, undef ) = $self->{classifier__}->classify_and_modify( # PROFILE BLOCK START $session, \*RETRFILE, $client, 1, $downloaded{$count}{class}, $downloaded{$count}{slot} ); # PROFILE BLOCK STOP print $client ".$eol"; close RETRFILE; } else { # Retrieve file directly from the server # Get the message from the remote server, if there's # an error then we're done, but if not then we echo # each line of the message until we hit the . at the # end my $response = $self->echo_response_($mail, $client, $command ); last if ( $response == 2 ); if ( $response == 0 ) { my $slot; ( $class, $slot ) = # PROFILE BLOCK START $self->{classifier__}->classify_and_modify( $session, $mail, $client, 0, '', 0 ); # PROFILE BLOCK STOP # Note locally that file has been retrieved if the # full thing has been saved to disk $downloaded{$count}{slot} = $slot; $downloaded{$count}{class} = $class; } } next; } # The mail client wants to stop using the server, so send that # message through to the real mail server, echo the response # back up to the client and exit the while. We will close the # connection immediately if ( $command =~ /QUIT/i ) { if ( $mail ) { last if ( $self->echo_response_( $mail, $client, $command ) == 2 ); close $mail; } else { $self->tee_( $client, "+OK goodbye$eol" ); } last; } # Don't know what this is so let's just pass it through and # hope for the best if ( $mail && $mail->connected ) { last if ( $self->echo_response_($mail, $client, $command ) == 2 ); next; } else { $self->tee_( $client, "-ERR unknown command or bad syntax$eol" ); next; } } if ( defined( $mail ) ) { $self->done_slurp_( $mail ); close $mail; } close $client; $self->mq_post_( 'CMPLT', $$ ); $self->log_( 0, "POP3 proxy done" ); } # ---------------------------------------------------------------------------- # # configure_item # # $name Name of this item # $templ The loaded template that was passed as a parameter # when registering # $language Current language # # ---------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $templ, $language ) = @_; if ( $name eq 'pop3_configuration' ) { $templ->param( 'POP3_Configuration_If_Force_Fork' => ( $self->config_( 'force_fork' ) == 0 ) ); $templ->param( 'POP3_Configuration_Port' => $self->config_( 'port' ) ); $templ->param( 'POP3_Configuration_Separator' => $self->config_( 'separator' ) ); } else { if ( $name eq 'pop3_security' ) { $templ->param( 'POP3_Security_Local' => ( $self->config_( 'local' ) == 1 ) ); } else { if ( $name eq 'pop3_chain' ) { $templ->param( 'POP3_Chain_Secure_Server' => $self->config_( 'secure_server' ) ); $templ->param( 'POP3_Chain_Secure_Port' => $self->config_( 'secure_port' ) ); } else { $self->SUPER::configure_item( $name, $templ, $language ); } } } } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $templ The loaded template # $language The language currently in use # $form Hash containing all form items # # ---------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $templ, $language, $form ) = @_; if ( $name eq 'pop3_configuration' ) { if ( defined($$form{pop3_port}) ) { if ( ( $$form{pop3_port} >= 1 ) && ( $$form{pop3_port} < 65536 ) && ( $self->module_config_( 'html', 'port' ) ne $$form{pop3_port} ) ) { $self->config_( 'port', $$form{pop3_port} ); $templ->param( 'POP3_Configuration_If_Port_Updated' => 1 ); $templ->param( 'POP3_Configuration_Port_Updated' => sprintf( $$language{Configuration_POP3Update}, $self->config_( 'port' ) ) ); } else { if ( ( $self->module_config_( 'html', 'port' ) ne $$form{pop3_port} ) ) { $templ->param( 'POP3_Configuration_If_Port_Error' => 1 ); } else { $templ->param( 'POP3_Configuration_If_UI_Port_Error' => 1 ); } } } if ( defined($$form{pop3_separator}) ) { if ( length($$form{pop3_separator}) == 1 ) { $self->config_( 'separator', $$form{pop3_separator} ); $templ->param( 'POP3_Configuration_If_Sep_Updated' => 1 ); $templ->param( 'POP3_Configuration_Sep_Updated' => sprintf( $$language{Configuration_POP3SepUpdate}, $self->config_( 'separator' ) ) ); } else { $templ->param( 'POP3_Configuration_If_Sep_Error' => 1 ); } } if ( defined($$form{pop3_force_fork}) ) { $self->config_( 'force_fork', $$form{pop3_force_fork} ); } return; } if ( $name eq 'pop3_security' ) { $self->config_( 'local', $$form{pop3_local}-1 ) if ( defined($$form{pop3_local}) ); return; } if ( $name eq 'pop3_chain' ) { if ( defined( $$form{server} ) ) { $self->config_( 'secure_server', $$form{server} ); $templ->param( 'POP3_Chain_If_Server_Updated' => 1 ); $templ->param( 'POP3_Chain_Server_Updated' => sprintf( $$language{Security_SecureServerUpdate}, $self->config_( 'secure_server' ) ) ); } if ( defined($$form{sport}) ) { if ( ( $$form{sport} >= 1 ) && ( $$form{sport} < 65536 ) ) { $self->config_( 'secure_port', $$form{sport} ); $templ->param( 'POP3_Chain_If_Port_Updated' => 1 ); $templ->param( 'POP3_Chain_Port_Updated' => sprintf( $$language{Security_SecurePortUpdate}, $self->config_( 'secure_port' ) ) ); } else { $templ->param( 'POP3_Chain_If_Port_Error' => 1 ); } } return; } $self->SUPER::validate_item( $name, $templ, $language, $form ); } 1; popfile-1.1.3+dfsg/Proxy/Proxy.pm0000664000175000017500000005736311710356074016167 0ustar danieldanielpackage Proxy::Proxy; # ---------------------------------------------------------------------------- # # This module implements the base class for all POPFile proxy Modules # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # # ---------------------------------------------------------------------------- use POPFile::Module; @ISA = ( "POPFile::Module" ); use IO::Handle; use IO::Socket; use IO::Select; # A handy variable containing the value of an EOL for networks my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function, all real work gets done by initialize and # the things set up here are more for documentation purposes than # anything so that you know that they exists # #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); # A reference to the classifier and history $self->{classifier__} = 0; $self->{history__} = 0; # Reference to a child() method called to handle a proxy # connection $self->{child_} = 0; # Holding variable for MSWin32 pipe handling $self->{pipe_cache__} = {}; # This is where we keep the session with the Classifier::Bayes # module $self->{api_session__} = ''; # This is the error message returned if the connection at any # time times out while handling a command # # $self->{connection_timeout_error_} = ''; # This is the error returned (with the host and port appended) # if contacting the remote server fails # # $self->{connection_failed_error_} = ''; # This is a regular expression used by get_response_ to determine # if a response from the remote server is good or not (good being # that the last command succeeded) # # $self->{good_response_} = ''; $self->{ssl_not_supported_error_} = '-ERR SSL connection is not supported since required modules are not installed'; # Connect Banner returned by the real server $self->{connect_banner__} = ''; return bless $self, $type; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the Proxy, most of this is handled by a subclass of this # but here we set the 'enabled' flag # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; $self->config_( 'enabled', 1 ); # The following parameters are for SOCKS proxy handling on outbound # connections $self->config_( 'socks_server', '' ); $self->config_( 'socks_port', 1080 ); return 1; } # ---------------------------------------------------------------------------- # # start # # Called when all configuration information has been loaded from disk. # # The method should return 1 to indicate that it started correctly, if it returns # 0 then POPFile will abort loading immediately # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # Open the socket used to receive request for proxy service $self->log_( 1, "Opening listening socket on port " . $self->config_('port') . '.' ); $self->{server__} = IO::Socket::INET->new( Proto => 'tcp', # PROFILE BLOCK START ($self->config_( 'local' ) || 0) == 1 ? (LocalAddr => 'localhost') : (), LocalPort => $self->config_( 'port' ), Listen => SOMAXCONN, Reuse => 1 ); # PROFILE BLOCK STOP my $name = $self->name(); if ( !defined( $self->{server__} ) ) { my $port = $self->config_( 'port' ); $self->log_( 0, "Couldn't start the $name proxy because POPFile could not bind to the listen port $port" ); print STDERR <{selector__} = new IO::Select( $self->{server__} ); # Tell the UI about the SOCKS parameters $self->register_configuration_item_( 'configuration', # PROFILE BLOCK START $name . '_socks_configuration', 'socks-widget.thtml', $self ); # PROFILE BLOCK STOP return 1; } # ---------------------------------------------------------------------------- # # stop # # Called when POPFile is closing down, this is the last method that # will get called before the object is destroyed. There is no return # value from stop(). # # ---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; if ( $self->{api_session__} ne '' ) { $self->{classifier__}->release_session_key( $self->{api_session__} ); } # Need to close all the duplicated file handles, this include the # POP3 listener and all the reading ends of pipes to active # children close $self->{server__} if ( defined( $self->{server__} ) ); } # ---------------------------------------------------------------------------- # # service # # service() is a called periodically to give the module a chance to do # housekeeping work. # # If any problem occurs that requires POPFile to shutdown service() # should return 0 and the top level process will gracefully terminate # POPFile including calling all stop() methods. In normal operation # return 1. # # ---------------------------------------------------------------------------- sub service { my ( $self ) = @_; # Accept a connection from a client trying to use us as the mail # server. We service one client at a time and all others get # queued up to be dealt with later. We check the alive boolean # here to make sure we are still allowed to operate. See if # there's a connection waiting on the $server by getting the list # of handles with data to read, if the handle is the server then # we're off. if ( ( defined( $self->{selector__}->can_read(0) ) ) && # PROFILE BLOCK START ( $self->{alive_} ) ) { # PROFILE BLOCK STOP if ( my $client = $self->{server__}->accept() ) { # Check to see if we have obtained a session key yet if ( $self->{api_session__} eq '' ) { $self->{api_session__} = # PROFILE BLOCK START $self->{classifier__}->get_session_key( 'admin', '' ); # PROFILE BLOCK STOP } # Check that this is a connection from the local machine, # if it's not then we drop it immediately without any # further processing. We don't want to act as a proxy for # just anyone's email my ( $remote_port, $remote_host ) = sockaddr_in( # PROFILE BLOCK START $client->peername() ); # PROFILE BLOCK STOP if ( ( ( $self->config_( 'local' ) || 0 ) == 0 ) || # PROFILE BLOCK START ( $remote_host eq inet_aton( "127.0.0.1" ) ) ) { # PROFILE BLOCK STOP # If we have force_fork turned on then we will do a # fork, otherwise we will handle this inline, in the # inline case we need to create the two ends of a pipe # that will be used as if there was a child process binmode( $client ); if ( $self->config_( 'force_fork' ) ) { my ( $pid, $pipe ) = &{$self->{forker_}}; # If we fail to fork, or are in the child process # then process this request if ( !defined( $pid ) || ( $pid == 0 ) ) { $self->{child_}( $self, $client, # PROFILE BLOCK START $self->{api_session__} ); # PROFILE BLOCK STOP if ( defined( $pid ) ) { &{$self->{childexit_}}( 0 ); } } } else { pipe my $reader, my $writer; $self->{child_}( $self, $client, $self->{api_session__} ); close $reader; } } close $client; } } return 1; } # ---------------------------------------------------------------------------- # # forked # # This is called when some module forks POPFile and is within the # context of the child process so that this module can close any # duplicated file handles that are not needed. # # There is no return value from this method # # ---------------------------------------------------------------------------- sub forked { my ( $self ) = @_; close $self->{server__}; } # ---------------------------------------------------------------------------- # # tee_ # # $socket The stream (created with IO::) to send the string to # $text The text to output # # Sends $text to $socket and sends $text to debug output # # ---------------------------------------------------------------------------- sub tee_ { my ( $self, $socket, $text ) = @_; # Send the message to the debug output and then send it to the appropriate socket $self->log_( 1, $text ); print $socket $text; # don't print if $socket undef } # ---------------------------------------------------------------------------- # # echo_to_regexp_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # $regexp The pattern match to terminate echoing, compile using qr/pattern/ # $log (OPTIONAL) log output if 1, defaults to 0 if unset # $suppress (OPTIONAL) suppress any lines that match, compile using qr/pattern/ # # echo all information from the $mail server until a single line matching $regexp is seen # # ---------------------------------------------------------------------------- sub echo_to_regexp_ { my ( $self, $mail, $client, $regexp, $log, $suppress ) = @_; $log = 0 if (!defined($log)); while ( my $line = $self->slurp_( $mail ) ) { if (!defined($suppress) || !( $line =~ $suppress )) { if ( !$log ) { print $client $line; } else { $self->tee_( $client, $line ); } } else { $self->log_( 2, "Suppressed: $line" ); } if ( $line =~ $regexp ) { last; } } } # ---------------------------------------------------------------------------- # # echo_to_dot_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # # echo all information from the $mail server until a single line with a . is seen # # ---------------------------------------------------------------------------- sub echo_to_dot_ { my ( $self, $mail, $client ) = @_; # The termination has to be a single line with exactly a dot on it and nothing # else other than line termination characters. This is vital so that we do # not mistake a line beginning with . as the end of the block $self->echo_to_regexp_( $mail, $client, qr/^\.(\r\n|\r|\n)$/); } # ---------------------------------------------------------------------------- # # get_response_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # $command The text of the command to send (we add an EOL) # $null_resp Allow a null response # $suppress If set to 1 then the response does not go to the client # # Send $command to $mail, receives the response and echoes it to the $client and the debug # output. Returns the response and a failure code indicating false if there was a timeout # # ---------------------------------------------------------------------------- sub get_response_ { my ( $self, $mail, $client, $command, $null_resp, $suppress ) = @_; $null_resp = 0 if (!defined $null_resp); $suppress = 0 if (!defined $suppress); unless ( defined($mail) && $mail->connected ) { # $mail is undefined - return an error intead of crashing $self->tee_( $client, "$self->{connection_timeout_error_}$eol" ); return ( $self->{connection_timeout_error_}, 0 ); } # Send the command (followed by the appropriate EOL) to the mail server $self->tee_( $mail, $command. $eol ); my $response; # Retrieve a single string containing the response my $can_read = 0; if ( $mail =~ /ssl/i ) { $can_read = ( $mail->pending() > 0 ); } if ( !$can_read ) { my $selector = new IO::Select( $mail ); my ( $ready ) = $selector->can_read( # PROFILE BLOCK START ( !$null_resp ? $self->global_config_( 'timeout' ) : .5 ) ); # PROFILE BLOCK STOP $can_read = defined( $ready ) && ( $ready == $mail ); } if ( $can_read ) { $response = $self->slurp_( $mail ); if ( $response ) { # Echo the response up to the mail client $self->tee_( $client, $response ) if ( !$suppress ); return ( $response, 1 ); } } if ( !$null_resp ) { # An error has occurred reading from the mail server $self->tee_( $client, "$self->{connection_timeout_error_}$eol" ); return ( $self->{connection_timeout_error_}, 0 ); } else { $self->tee_($client, ""); return ( "", 1 ); } } # ---------------------------------------------------------------------------- # # echo_response_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # $command The text of the command to send (we add an EOL) # $suppress If set to 1 then the response does not go to the client # # Send $command to $mail, receives the response and echoes it to the $client and the debug # output. # # Returns one of three values # # 0 Successfully sent the command and got a positive response # 1 Sent the command and got a negative response # 2 Failed to send the command (e.g. a timeout occurred) # # ---------------------------------------------------------------------------- sub echo_response_ { my ( $self, $mail, $client, $command, $suppress ) = @_; # Determine whether the response began with the string +OK. If it did then return 1 # else return 0 my ( $response, $ok ) = $self->get_response_( $mail, $client, $command, 0, $suppress ); if ( $ok == 1 ) { if ( $response =~ /$self->{good_response_}/ ) { return 0; } else { return 1; } } else { return 2; } } # ---------------------------------------------------------------------------- # # verify_connected_ # # $mail The handle of the real mail server # $client The handle to the mail client # $hostname The host name of the remote server # $port The port # $ssl If set to 1 then the connection to the remote is established # using SSL # # Check that we are connected to $hostname on port $port putting the # open handle in $mail. Any messages need to be sent to $client # # ---------------------------------------------------------------------------- sub verify_connected_ { my ( $self, $mail, $client, $hostname, $port, $ssl ) = @_; $ssl = 0 if ( !defined( $ssl ) ); # Check to see if we are already connected return $mail if ( $mail && $mail->connected ); # Connect to the real mail server on the standard port, if we are using # SOCKS then go through the proxy server if ( $self->config_( 'socks_server' ) ne '' ) { require IO::Socket::Socks; $self->log_( 0, "Attempting to connect to socks server at " # PROFILE BLOCK START . $self->config_( 'socks_server' ) . ":" . ProxyPort => $self->config_( 'socks_port' ) ); # PROFILE BLOCK STOP $mail = IO::Socket::Socks->new( # PROFILE BLOCK START ProxyAddr => $self->config_( 'socks_server' ), ProxyPort => $self->config_( 'socks_port' ), ConnectAddr => $hostname, ConnectPort => $port ); # PROFILE BLOCK STOP } else { if ( $ssl ) { eval { require IO::Socket::SSL; }; if ( $@ ) { # Cannot load IO::Socket::SSL $self->tee_( $client, "$self->{ssl_not_supported_error_}$eol" ); return undef; } $self->log_( 0, "Attempting to connect to SSL server at " # PROFILE BLOCK START . "$hostname:$port" ); # PROFILE BLOCK STOP $mail = IO::Socket::SSL->new( # PROFILE BLOCK START Proto => "tcp", PeerAddr => $hostname, PeerPort => $port, Timeout => $self->global_config_( 'timeout' ), Domain => AF_INET, ); # PROFILE BLOCK STOP } else { $self->log_( 0, "Attempting to connect to POP server at " # PROFILE BLOCK START . "$hostname:$port" ); # PROFILE BLOCK STOP $mail = IO::Socket::INET->new( # PROFILE BLOCK START Proto => "tcp", PeerAddr => $hostname, PeerPort => $port, Timeout => $self->global_config_( 'timeout' ), ); # PROFILE BLOCK STOP } } # Check that the connect succeeded for the remote server if ( $mail ) { if ( $mail->connected ) { $self->log_( 0, "Connected to $hostname:$port timeout " . $self->global_config_( 'timeout' ) ); # Set binmode on the socket so that no translation of CRLF # occurs if ( !$ssl ) { binmode( $mail ); } if ( !$ssl || ( $mail->pending() == 0 ) ) { # Wait 'timeout' seconds for a response from the remote server and # if there isn't one then give up trying to connect my $selector = new IO::Select( $mail ); last unless $selector->can_read($self->global_config_( 'timeout' )); } # Read the response from the real server and say OK my $buf = ''; my $max_length = 8192; my $n = sysread( $mail, $buf, $max_length, length $buf ); if ( !( $buf =~ /[\r\n]/ ) ) { my $hit_newline = 0; my $temp_buf; # If we are on Windows, we will have to wait ourselves as # we are not going to call IO::Select::can_read. my $wait = ( ($^O eq 'MSWin32') && !($mail =~ /socket/i) ) ? 1 : 0; # Read until timeout or a newline (newline _should_ be immediate) for my $i ( 0..($self->global_config_( 'timeout' ) * 100) ) { if ( !$hit_newline ) { $temp_buf = $self->flush_extra_( $mail, $client, 1 ); $hit_newline = ( $temp_buf =~ /[\r\n]/ ); $buf .= $temp_buf; if ( $wait && ! length $temp_buf ) { select undef, undef, undef, 0.01; } } else { last; } } } $self->log_( 1, "Connection returned: $buf" ); # If we cannot read any response from server, close the connection if ( $buf eq '' ) { close $mail; last; } $self->{connect_banner__} = $buf; # Clean up junk following a newline for my $i ( 0..4 ) { $self->flush_extra_( $mail, $client, 1 ); } return $mail; } } $self->log_( 0, "IO::Socket::INET or IO::Socket::SSL gets an error: $@" ); # Tell the client we failed $self->tee_( $client, "$self->{connection_failed_error_} $hostname:$port$eol" ); return undef; } # ---------------------------------------------------------------------------- # # configure_item # # $name The name of the item being configured, was passed in by # the call # to register_configuration_item # $templ The loaded template # # ---------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $templ ) = @_; $templ->param( 'Socks_Widget_Name' => $self->name() ); $templ->param( 'Socks_Server' => $self->config_( 'socks_server' ) ); $templ->param( 'Socks_Port' => $self->config_( 'socks_port' ) ); } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $templ The loaded template # $language Reference to the hash holding the current language # $form Hash containing all form items # # Must return the HTML for this item # ---------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $templ, $language, $form ) = @_; my $me = $self->name(); if ( defined($$form{"$me" . "_socks_port"}) ) { if ( ( $$form{"$me" . "_socks_port"} >= 1 ) && ( $$form{"$me" . "_socks_port"} < 65536 ) ) { $self->config_( 'socks_port', $$form{"$me" . "_socks_port"} ); $templ->param( 'Socks_Widget_If_Port_Updated' => 1 ); $templ->param( 'Socks_Widget_Port_Updated' => sprintf( $$language{Configuration_SOCKSPortUpdate}, $self->config_( 'socks_port' ) ) ); } else { $templ->param( 'Socks_Widget_If_Port_Error' => 1 ); } } if ( defined($$form{"$me" . "_socks_server"}) ) { $self->config_( 'socks_server', $$form{"$me" . "_socks_server"} ); $templ->param( 'Socks_Widget_If_Server_Updated' => 1 ); $templ->param( 'Socks_Widget_Server_Updated' => sprintf( $$language{Configuration_SOCKSServerUpdate}, $self->config_( 'socks_server' ) ) ); } } # SETTERS sub classifier { my ( $self, $classifier ) = @_; $self->{classifier__} = $classifier; } sub history { my ( $self, $history ) = @_; $self->{history__} = $history; } 1; popfile-1.1.3+dfsg/Proxy/SMTP.pm0000664000175000017500000003400211710356074015612 0ustar danieldaniel# POPFILE LOADABLE MODULE package Proxy::SMTP; use Proxy::Proxy; @ISA = ("Proxy::Proxy"); # ---------------------------------------------------------------------------- # # This module handles proxying the SMTP protocol for POPFile. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use warnings; use locale; # A handy variable containing the value of an EOL for networks my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = Proxy::Proxy->new(); # Must call bless before attempting to call any methods bless $self, $type; $self->name( 'smtp' ); $self->{child_} = \&child__; $self->{connection_timeout_error_} = '554 Transaction failed'; $self->{connection_failed_error_} = '554 Transaction failed, can\'t connect to'; $self->{good_response_} = '^[23]'; return $self; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the SMTP proxy module # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # By default we don't fork on Windows $self->config_( 'force_fork', ($^O eq 'MSWin32')?0:1 ); # Default port for SMTP service $self->config_( 'port', 25 ); # Where to forward on to $self->config_( 'chain_server', '' ); $self->config_( 'chain_port', 25 ); # Only accept connections from the local machine for smtp $self->config_( 'local', 1 ); # The welcome string from the proxy is configurable $self->config_( 'welcome_string', "SMTP POPFile ($self->{version_}) welcome" ); if ( !$self->SUPER::initialize() ) { return 0; } $self->config_( 'enabled', 0 ); return 1; } # ---------------------------------------------------------------------------- # # start # # Called to start the SMTP proxy module # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # If we are not enabled then no further work happens in this module if ( $self->config_( 'enabled' ) == 0 ) { return 2; } # Tell the user interface module that we having a configuration # item that needs a UI component $self->register_configuration_item_( 'configuration', 'smtp_fork_and_port', 'smtp-configuration.thtml', $self ); $self->register_configuration_item_( 'security', 'smtp_local', 'smtp-security-local.thtml', $self ); $self->register_configuration_item_( 'chain', 'smtp_server', 'smtp-chain-server.thtml', $self ); $self->register_configuration_item_( 'chain', 'smtp_server_port', 'smtp-chain-server-port.thtml', $self ); if ( $self->config_( 'welcome_string' ) =~ /^SMTP POPFile \(v\d+\.\d+\.\d+\) welcome$/ ) { # PROFILE BLOCK START $self->config_( 'welcome_string', "SMTP POPFile ($self->{version_}) welcome" ); # PROFILE BLOCK STOP } return $self->SUPER::start();; } # ---------------------------------------------------------------------------- # # child__ # # The worker method that is called when we get a good connection from # a client # # $client - an open stream to a SMTP client # $session - API session key # # ---------------------------------------------------------------------------- sub child__ { my ( $self, $client, $session ) = @_; # Number of messages downloaded in this session my $count = 0; # The handle to the real mail server gets stored here my $mail; # Tell the client that we are ready for commands and identify our # version number $self->tee_( $client, "220 " . $self->config_( 'welcome_string' ) . "$eol" ); # Retrieve commands from the client and process them until the # client disconnects or we get a specific QUIT command while ( <$client> ) { my $command; $command = $_; # Clean up the command so that it has a nice clean $eol at the end $command =~ s/(\015|\012)//g; $self->log_( 2, "Command: --$command--" ); if ( $command =~ /HELO/i ) { if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { $self->smtp_echo_response_( $mail, $client, $command ); } else { last; } } else { $self->tee_( $client, "421 service not available$eol" ); } next; } # Handle EHLO specially so we can control what ESMTP extensions are negotiated if ( $command =~ /EHLO/i ) { if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { # TODO: Make this user-configurable (-smtp_add_unsupported, -smtp_remove_unsupported) # Stores a list of unsupported ESMTP extensions my $unsupported; # RFC 1830, http://www.faqs.org/rfcs/rfc1830.html # CHUNKING and BINARYMIME both require the support of the "BDAT" command # support of BDAT requires extensive changes to POPFile's internals and # will not be implemented at this time $unsupported .= "CHUNKING|BINARYMIME|XEXCH50"; # append unsupported ESMTP extensions to $unsupported here, important to maintain # format of OPTION|OPTION2|OPTION3 $unsupported = qr/250\-$unsupported/; $self->smtp_echo_response_( $mail, $client, $command, $unsupported ); } else { last; } } else { $self->tee_( $client, "421 service not available$eol" ); } next; } if ( ( $command =~ /MAIL FROM:/i ) || # PROFILE BLOCK START ( $command =~ /RCPT TO:/i ) || ( $command =~ /VRFY/i ) || ( $command =~ /EXPN/i ) || ( $command =~ /NOOP/i ) || ( $command =~ /HELP/i ) || ( $command =~ /RSET/i ) ) { # PROFILE BLOCK STOP $self->smtp_echo_response_( $mail, $client, $command ); next; } if ( $command =~ /DATA/i ) { # Get the message from the remote server, if there's an error then we're done, but if not then # we echo each line of the message until we hit the . at the end if ( $self->smtp_echo_response_( $mail, $client, $command ) ) { $count += 1; my ( $class, $history_file ) = $self->{classifier__}->classify_and_modify( $session, $client, $mail, 0, '', 0 ); my $response = $self->slurp_( $mail ); $self->tee_( $client, $response ); next; } } # The mail client wants to stop using the server, so send that message through to the # real mail server, echo the response back up to the client and exit the while. We will # close the connection immediately if ( $command =~ /QUIT/i ) { if ( $mail ) { $self->smtp_echo_response_( $mail, $client, $command ); close $mail; } else { $self->tee_( $client, "221 goodbye$eol" ); } last; } # Don't know what this is so let's just pass it through and hope for the best if ( $mail && $mail->connected ) { $self->smtp_echo_response_( $mail, $client, $command ); next; } else { $self->tee_( $client, "500 unknown command or bad syntax$eol" ); last; } } if ( defined( $mail ) ) { $self->done_slurp_( $mail ); close $mail; } close $client; $self->mq_post_( 'CMPLT', $$ ); $self->log_( 0, "SMTP proxy done" ); } # ---------------------------------------------------------------------------- # # smtp_echo_response_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # $command The text of the command to send (we add an EOL) # $suppress (OPTIONAL) suppress any lines that match, compile using qr/pattern/ # # Send $command to $mail, receives the response and echoes it to the $client and the debug # output. # # This subroutine returns responses from the server as defined in appendix E of # RFC 821, allowing multi-line SMTP responses. # # Returns true if the initial response is a 2xx or 3xx series (as defined by {good_response_} # # ---------------------------------------------------------------------------- sub smtp_echo_response_ { my ($self, $mail, $client, $command, $suppress) = @_; my ( $response, $ok ) = $self->get_response_( $mail, $client, $command ); if ( $response =~ /^\d\d\d-/ ) { $self->echo_to_regexp_($mail, $client, qr/^\d\d\d /, 1, $suppress); } return ( $response =~ /$self->{good_response_}/ ); } # ---------------------------------------------------------------------------- # # configure_item # # $name Name of this item # $templ The loaded template that was passed as a parameter # when registering # $language Current language # # ---------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $templ, $language ) = @_; if ( $name eq 'smtp_fork_and_port' ) { $templ->param( 'smtp_port' => $self->config_( 'port' ) ); $templ->param( 'smtp_force_fork_on' => $self->config_( 'force_fork' ) ); return; } if ( $name eq 'smtp_local' ) { $templ->param( 'smtp_local_on' => $self->config_( 'local' ) ); return; } if ( $name eq 'smtp_server' ) { $templ->param( 'smtp_chain_server' => $self->config_( 'chain_server' ) ); return; } if ( $name eq 'smtp_server_port' ) { $templ->param( 'smtp_chain_port' => $self->config_( 'chain_port' ) ); return; } $self->SUPER::configure_item( $name, $templ, $language ); } # ---------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $templ The loaded template # $language The language currently in use # $form Hash containing all form items # # ---------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $templ, $language, $form ) = @_; if ( $name eq 'smtp_fork_and_port' ) { if ( defined($$form{smtp_force_fork}) ) { $self->config_( 'force_fork', $$form{smtp_force_fork} ); } if ( defined($$form{smtp_port}) ) { if ( ( $$form{smtp_port} >= 1 ) && ( $$form{smtp_port} < 65536 ) ) { $self->config_( 'port', $$form{smtp_port} ); $templ->param( 'smtp_port_feedback' => sprintf( $$language{Configuration_SMTPUpdate}, $self->config_( 'port' ) ) ); } else { $templ->param( 'smtp_port_feedback' => "
$$language{Configuration_Error3}
" ); } } return; } if ( $name eq 'smtp_local' ) { if ( defined $$form{smtp_local} ) { $self->config_( 'local', $$form{smtp_local} ); } return; } if ( $name eq 'smtp_server' ) { if ( defined $$form{smtp_chain_server} ) { $self->config_( 'chain_server', $$form{smtp_chain_server} ); $templ->param( 'smtp_server_feedback' => sprintf $$language{Security_SMTPServerUpdate}, $self->config_( 'chain_server' ) ) ; } return; } if ( $name eq 'smtp_server_port' ) { if ( defined $$form{smtp_chain_server_port} ) { if ( ( $$form{smtp_chain_server_port} >= 1 ) && ( $$form{smtp_chain_server_port} < 65536 ) ) { $self->config_( 'chain_port', $$form{smtp_chain_server_port} ); $templ->param( 'smtp_port_feedback' => sprintf $$language{Security_SMTPPortUpdate}, $self->config_( 'chain_port' ) ); } else { $templ->param( 'smtp_port_feedback' => "
$$language{Security_Error1}
" ); } } return; } $self->SUPER::validate_item( $name, $templ, $language, $form ); } 1; popfile-1.1.3+dfsg/POPFile/0000775000175000017500000000000011710356074014607 5ustar danieldanielpopfile-1.1.3+dfsg/POPFile/API.pm0000664000175000017500000001431611710356074015563 0ustar danieldanielpackage POPFile::API; # ---------------------------------------------------------------------------- # # API.pm -- The API to POPFile available through XML-RPC # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- sub new { my $type = shift; my $self; # This will store a reference to the classifier object $self->{c} = 0; bless $self, $type; return $self; } # I'm generally against doing obscure things in Perl because it makes the code # hard to read, but since this entire file is a bunch of wrappers for the # API in Classifier::Bayes I'm going to do something really odd looking for the # sake of readability here. # # Take for example the get_session_key wrapper for get_session_key. # It contains the line: # # shift->{c}->get_session_key( @_ ) # # What this does is the following: # # 1. The parameters for get_session_key are as usual in @_. The first # parameter (since this is an object) is a reference to this object. # # 2. We use 'shift' to get the reference to us (in all other places I # would call this $self). # # 3. We have a object variable called 'c' that contains a reference to the # Classifier::Bayes object we need to make the real call in. # # 4. So shift->{c} is a reference to Classifier::Bayes and hence we can do # shift->{c}->get_session_key() to call the real API. # # 5. shift has also popped the first parameter off of @_ leaving the rest of # the parameters for get_session_key in @_. Hence we can just pass in @_ # for all the parameters. # # 6. return is optional in Perl, so for the sake of horizontal space here I # omit it. sub get_session_key { shift->{c}->get_session_key( @_ ); } sub release_session_key { shift->{c}->release_session_key( @_ ); } sub classify { shift->{c}->classify( @_ ); } sub is_pseudo_bucket { shift->{c}->is_pseudo_bucket( @_ ); } sub is_bucket { shift->{c}->is_bucket( @_ ); } sub get_bucket_word_count { shift->{c}->get_bucket_word_count( @_ ); } sub get_word_count { shift->{c}->get_word_count( @_ ); } sub get_count_for_word { shift->{c}->get_count_for_word( @_ ); } sub get_bucket_unique_count { shift->{c}->get_bucket_unique_count( @_ ); } sub get_unique_word_count { shift->{c}->get_unique_word_count( @_ ); } sub get_bucket_color { shift->{c}->get_bucket_color( @_ ); } sub set_bucket_color { shift->{c}->set_bucket_color( @_ ); } sub get_bucket_parameter { shift->{c}->get_bucket_parameter( @_ ); } sub set_bucket_parameter { shift->{c}->set_bucket_parameter( @_ ); } sub create_bucket { shift->{c}->create_bucket( @_ ); } sub delete_bucket { shift->{c}->delete_bucket( @_ ); } sub rename_bucket { shift->{c}->rename_bucket( @_ ); } sub add_messages_to_bucket { shift->{c}->add_messages_to_bucket( @_ ); } sub add_message_to_bucket { shift->{c}->add_message_to_bucket( @_ ); } sub remove_message_from_bucket { shift->{c}->remove_message_from_bucket( @_ ); } sub clear_bucket { shift->{c}->clear_bucket( @_ ); } sub clear_magnets { shift->{c}->clear_magnets( @_ ); } sub create_magnet { shift->{c}->create_magnet( @_ ); } sub delete_magnet { shift->{c}->delete_magnet( @_ ); } sub magnet_count { shift->{c}->magnet_count( @_ ); } sub add_stopword { shift->{c}->add_stopword( @_ ); } sub remove_stopword { shift->{c}->remove_stopword( @_ ); } sub get_html_colored_message { shift->{c}->get_html_colored_message( @_ ); } # These APIs return lists and need to be altered to arrays before returning # them through XMLRPC otherwise you get the wrong result. sub get_buckets { [ shift->{c}->get_buckets( @_ ) ]; } sub get_pseudo_buckets { [ shift->{c}->get_pseudo_buckets( @_ ) ]; } sub get_all_buckets { [ shift->{c}->get_all_buckets( @_ ) ]; } sub get_buckets_with_magnets { [ shift->{c}->get_buckets_with_magnets( @_ ) ]; } sub get_magnet_types_in_bucket { [ shift->{c}->get_magnet_types_in_bucket( @_ ) ]; } sub get_magnets { [ shift->{c}->get_magnets( @_ ) ]; } sub get_magnet_types { [ shift->{c}->get_magnet_types( @_ ) ]; } sub get_stopword_list { [ shift->{c}->get_stopword_list( @_ ) ]; } sub get_bucket_word_list { [ shift->{c}->get_bucket_word_list( @_ ) ]; } sub get_bucket_word_prefixes { [ shift->{c}->get_bucket_word_prefixes( @_ ) ]; } # This API is used to add a message to POPFile's history, process the message # and do all the things POPFile would have done if it had received the message # through its proxies. # # Pass in the name of file to read and a file to write. The read file # will be processed and the out file created containing the processed # message. # # Returns the same output as classify_and_modify (which contains the # slot ID for the newly added message, the classification and magnet # ID). If it fails it returns undef. sub handle_message { my ( $self, $session, $in, $out ) = @_; return undef if ( !-f $in ); # Examine the session key is valid my @buckets = $self->{c}->get_buckets( $session ); return undef if ( !defined( $buckets[0] ) ); # Convert the two files into streams that can be passed to the # classifier open IN, "<$in" or return undef; open OUT, ">$out" or return undef; my @result = $self->{c}->classify_and_modify( $session, \*IN, \*OUT, undef ); close OUT; close IN; return @result; } 1; popfile-1.1.3+dfsg/POPFile/Configuration.pm0000664000175000017500000005364211710356074017766 0ustar danieldaniel# POPFILE LOADABLE MODULE package POPFile::Configuration; use POPFile::Module; @ISA = ( "POPFile::Module" ); #---------------------------------------------------------------------------- # # This module handles POPFile's configuration parameters. It is used to # load and save from the popfile.cfg file and individual POPFile modules # register specific parameters with this module. This module also handles # POPFile's command line parsing # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use strict; use warnings; use locale; use Getopt::Long; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); # This hash has indexed by parameter name and has two fields: # # value The current value # default The default value $self->{configuration_parameters__} = {}; # Name of the PID file that we created $self->{pid_file__} = ''; # The last time the PID was checked $self->{pid_check__} = time; # Used to tell whether we need to save the configuration $self->{save_needed__} = 0; # We track when out start() is called so that we know when the modules # are done setting the default values so that we know which have default # and which do not $self->{started__} = 0; # Local copies of POPFILE_ROOT and POPFILE_USER $self->{popfile_root__} = $ENV{POPFILE_ROOT} || './'; $self->{popfile_user__} = $ENV{POPFILE_USER} || './'; bless $self, $type; $self->name( 'config' ); return $self; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the interface # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # This is the location where we store the PID of POPFile in a file # called popfile.pid $self->config_( 'piddir', './' ); # The default interval of checking pid file in seconds # To turn off checking, set this option to 0 $self->config_( 'pidcheck_interval', 5 ); # The default timeout in seconds for POP3 commands $self->global_config_( 'timeout', 60 ); # The default location for the message files $self->global_config_( 'msgdir', 'messages/' ); # The maximum number of characters to consider in a message during # classification, display or reclassification $self->global_config_( 'message_cutoff', 100000 ); # Checking for updates if off by default $self->global_config_( 'update_check', 0 ); # The last time we checked for an update using the local epoch $self->global_config_( 'last_update_check', 0 ); # Register for the TICKD message which is sent hourly by the # Logger module. We use this to hourly save the configuration file # so that POPFile's configuration is saved in case of a hard crash. # # This is particularly needed by the IMAP module which stores some # state related information in the configuration parameters. Note that # because of the save_needed__ bool there wont be any write to the # disk unless a configuration parameter has been changed since the # last save. (see parameter()) $self->mq_register_( 'TICKD', $self ); return 1; } # ---------------------------------------------------------------------------- # # start # # Called to start this module # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; $self->{started__} = 1; # Check to see if the PID file is present, if it is then another # POPFile may be running, warn the user and terminate, note the 0 # at the end means that we allow the piddir to be absolute and # outside the user sandbox $self->{pid_file__} = $self->get_user_path( $self->config_( 'piddir' ) . 'popfile.pid', 0 ); if (defined($self->live_check_())) { return 0; } $self->write_pid_(); return 1; } # ---------------------------------------------------------------------------- # # service # # service() is a called periodically to give the module a chance to do # housekeeping work. # # If any problem occurs that requires POPFile to shutdown service() # should return 0 and the top level process will gracefully terminate # POPFile including calling all stop() methods. In normal operation # return 1. # # ---------------------------------------------------------------------------- sub service { my ( $self ) = @_; my $time = time; if ( $self->config_( 'pidcheck_interval' ) > 0 ) { if ( $self->{pid_check__} <= ( $time - $self->config_( 'pidcheck_interval' ))) { $self->{pid_check__} = $time; if ( !$self->check_pid_() ) { $self->write_pid_(); $self->log_( 0, "New POPFile instance detected and signalled" ); } } } return 1; } # ---------------------------------------------------------------------------- # # stop # # Called to shutdown this module # # ---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; $self->save_configuration(); $self->delete_pid_(); } # ---------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # ---------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; if ( $type eq 'TICKD' ) { $self->save_configuration(); } } # ---------------------------------------------------------------------------- # # live_check_ # # Checks if an instance of POPFile is currently running. Takes 10 seconds. # Returns the process-ID of the currently running POPFile, undef if none. # # ---------------------------------------------------------------------------- sub live_check_ { my ( $self ) = @_; if ( $self->check_pid_() ) { my $oldpid = $self->get_pid_(); my $wait_time = $self->config_( 'pidcheck_interval' ) * 2; my $error = "\n\nA copy of POPFile appears to be running.\n Attempting to signal the previous copy.\n Waiting $wait_time seconds for a reply.\n"; $self->delete_pid_(); print STDERR $error; select( undef, undef, undef, $wait_time ); my $pid = $self->get_pid_(); if ( defined($pid) ) { $error = "\n A copy of POPFile is running.\n It has signaled that it is alive with process ID: $pid\n"; print STDERR $error; return $pid; } else { print STDERR "\nThe other POPFile ($oldpid) failed to signal back, starting new copy ($$)\n"; } } return undef; } # ---------------------------------------------------------------------------- # # check_pid_ # # returns 1 if the pid file exists, 0 otherwise # # ---------------------------------------------------------------------------- sub check_pid_ { my ( $self ) = @_; return (-e $self->{pid_file__}); } # ---------------------------------------------------------------------------- # # get_pid_ # # returns the pidfile proccess ID if a pid file is present, undef # otherwise (0 might be a valid PID) # # ---------------------------------------------------------------------------- sub get_pid_ { my ( $self ) = @_; if (open PID, $self->{pid_file__}) { my $pid = ; $pid =~ s/[\r\n]//g; close PID; return $pid; } return undef; } # ---------------------------------------------------------------------------- # # write_pid_ # # writes the current process-ID into the pid file # # ---------------------------------------------------------------------------- sub write_pid_ { my ( $self ) = @_; if ( open PID, ">$self->{pid_file__}" ) { print PID "$$\n"; close PID; } } # ---------------------------------------------------------------------------- # # delete_pid_ # # deletes the pid file # # ---------------------------------------------------------------------------- sub delete_pid_ { my ( $self ) = @_; unlink( $self->{pid_file__} ); } # ---------------------------------------------------------------------------- # # parse_command_line - Parse ARGV # # The arguments are the keys of the configuration hash. Any argument # that is not already defined in the hash generates an error, there # must be an even number of ARGV elements because each command # argument has to have a value. # # ---------------------------------------------------------------------------- sub parse_command_line { my ( $self ) = @_; # Options from the command line specified with the --set parameter my @set_options; # The following command line options are supported: # # --set Permanently sets a configuration item for the current user # -- Everything after this point is an old style POPFile option # # So its possible to do # # --set bayes_param=value --set=-bayes_param=value # --set -bayes_param=value -- -bayes_param value if ( !GetOptions( "set=s" => \@set_options ) ) { return 0; } # Join together the options specified with --set and those after # the --, the options in @set_options are going to be of the form # foo=bar and hence need to be split into foo bar my @options; for my $i (0..$#set_options) { $set_options[$i] =~ /-?(.+)=(.+)/; if ( !defined( $1 ) ) { print STDERR "\nBad option: $set_options[$i]\n"; return 0; } push @options, ("-$1"); if ( defined( $2 ) ) { push @options, ($2); } } push @options, @ARGV; if ( $#options >= 0 ) { my $i = 0; while ( $i <= $#options ) { # A command line argument must start with a - if ( $options[$i] =~ /^-(.+)$/ ) { my $parameter = $self->upgrade_parameter__($1); if (defined($self->{configuration_parameters__}{$parameter})) { if ( $i < $#options ) { $self->parameter( $parameter, $options[$i+1] ); $i += 2; } else { print STDERR "\nMissing argument for $options[$i]\n"; return 0; } } else { print STDERR "\nUnknown option $options[$i]\n"; return 0; } } else { print STDERR "\nExpected a command line option and got $options[$i]\n"; return 0; } } } return 1; } # ---------------------------------------------------------------------------- # # upgrade_parameter__ # # Given a parameter from either command line or from the configuration # file return the upgraded version (e.g. the old port parameter # becomes pop3_port # # ---------------------------------------------------------------------------- sub upgrade_parameter__ { my ( $self, $parameter ) = @_; # This table maps from the old parameter to the new one, for # example the old xpl parameter which controls insertion of the # X-POPFile-Link header in email is now called GLOBAL_xpl and is # accessed through POPFile::Module::global_config_ The old piddir # parameter is now config_piddir and is accessed through either # config_ if accessed from the config module or through # module_config_ from outside my %upgrades = ( # PROFILE BLOCK START # Parameters that are now handled by Classifier::Bayes 'corpus', 'bayes_corpus', 'unclassified_probability', 'bayes_unclassified_probability', # Parameters that are now handled by # POPFile::Configuration 'piddir', 'config_piddir', # Parameters that are now global to POPFile 'debug', 'GLOBAL_debug', 'msgdir', 'GLOBAL_msgdir', 'timeout', 'GLOBAL_timeout', # Parameters that are now handled by POPFile::Logger 'logdir', 'logger_logdir', # Parameters that are now handled by Proxy::POP3 'localpop', 'pop3_local', 'port', 'pop3_port', 'sport', 'pop3_secure_port', 'server', 'pop3_secure_server', 'separator', 'pop3_separator', 'toptoo', 'pop3_toptoo', # Parameters that are now handled by UI::HTML 'language', 'html_language', 'last_reset', 'html_last_reset', 'last_update_check', 'html_last_update_check', 'localui', 'html_local', 'page_size', 'html_page_size', 'password', 'html_password', 'send_stats', 'html_send_stats', 'skin', 'html_skin', 'test_language', 'html_test_language', 'update_check', 'html_update_check', 'ui_port', 'html_port', # Parameters that have moved from the UI::HTML to # POPFile::History 'archive', 'history_archive', 'archive_classes', 'history_archive_classes', 'archive_dir', 'history_archive_dir', 'history_days', 'history_history_days', 'html_archive', 'history_archive', 'html_archive_classes', 'history_archive_classes', 'html_archive_dir', 'history_archive_dir', 'html_history_days', 'history_history_days', # Parameters that have moved from UI::HTML to # global to POPFile 'html_update_check', 'GLOBAL_update_check', 'html_last_update_check', 'GLOBAL_last_update_check', ); # PROFILE BLOCK STOP if ( defined( $upgrades{$parameter} ) ) { return $upgrades{$parameter}; } else { return $parameter; } } # ---------------------------------------------------------------------------- # # load_configuration # # Loads the current configuration of popfile into the configuration # hash from a local file. The format is a very simple set of lines # containing a space separated name and value pair # # ---------------------------------------------------------------------------- sub load_configuration { my ( $self ) = @_; $self->{started__} = 1; my $config_file = $self->get_user_path( 'popfile.cfg' ); if ( open CONFIG, '<', $config_file ) { while ( ) { s/(\015|\012)//g; if ( /(\S+) (.+)?/ ) { my $parameter = $1; my $value = $2; $value = '' if !defined( $value ); $parameter = $self->upgrade_parameter__($parameter); # There's a special hack here inserted so that even if # the HTML module is not loaded the html_language # parameter is loaded and not discarded. That's done # so that the Japanese users can use insert.pl # etc. which rely on knowing the language if (defined($self->{configuration_parameters__}{$parameter}) || # PROFILE BLOCK START ( $parameter eq 'html_language' ) ) { # PROFILE BLOCK STOP $self->{configuration_parameters__}{$parameter}{value} = # PROFILE BLOCK START $value; # PROFILE BLOCK STOP } else { $self->{deprecated_parameters__}{$parameter} = $value; } } } close CONFIG; } else { if ( -e $config_file && !-r _ ) { $self->log_( 0, "Couldn't load from the configuration file $config_file" ); } } $self->{save_needed__} = 0; } # ---------------------------------------------------------------------------- # # save_configuration # # Saves the current configuration of popfile from the configuration # hash to a local file. # # ---------------------------------------------------------------------------- sub save_configuration { my ( $self ) = @_; if ( $self->{save_needed__} == 0 ) { return; } my $config_file = $self->get_user_path( 'popfile.cfg' ); my $config_temp = $self->get_user_path( 'popfile.cfg.tmp' ); if ( -e $config_file && !-w _ ) { $self->log_( 0, "Can't write to the configuration file $config_file" ); } if ( open CONFIG, '>', $config_temp ) { $self->{save_needed__} = 0; foreach my $key (sort keys %{$self->{configuration_parameters__}}) { print CONFIG "$key $self->{configuration_parameters__}{$key}{value}\n"; } close CONFIG; rename $config_temp, $config_file; } else { $self->log_( 0, "Couldn't open a temporary configuration file $config_temp" ); } } # ---------------------------------------------------------------------------- # # get_user_path, get_root_path # # Resolve a path relative to POPFILE_USER or POPFILE_ROOT # # $path The path to resolve # $sandbox Set to 1 if this path must be sandboxed (i.e. absolute # paths and paths containing .. are not accepted). # # ---------------------------------------------------------------------------- sub get_user_path { my ( $self, $path, $sandbox ) = @_; return $self->path_join__( $self->{popfile_user__}, $path, $sandbox ); } sub get_root_path { my ( $self, $path, $sandbox ) = @_; return $self->path_join__( $self->{popfile_root__}, $path, $sandbox ); } # ---------------------------------------------------------------------------- # # path_join__ # # Join two paths togther # # $left The LHS # $right The RHS # $sandbox Set to 1 if this path must be sandboxed (i.e. absolute # paths and paths containing .. are not accepted). # # ---------------------------------------------------------------------------- sub path_join__ { my ( $self, $left, $right, $sandbox ) = @_; $sandbox = 1 if ( !defined( $sandbox ) ); if ( ( $right =~ /^\// ) || # PROFILE BLOCK START ( $right =~ /^[A-Za-z]:[\/\\]/ ) || ( $right =~ /\\\\/ ) ) { # PROFILE BLOCK STOP if ( $sandbox ) { $self->log_( 0, "Attempt to access path $right outside sandbox" ); return undef; } else { return $right; } } if ( $sandbox && ( $right =~ /\.\./ ) ) { $self->log_( 0, "Attempt to access path $right outside sandbox" ); return undef; } $left =~ s/\/$//; $right =~ s/^\///; return "$left/$right"; } # ---------------------------------------------------------------------------- # # parameter # # Gets or sets a parameter # # $name Name of the parameter to get or set # $value Optional value to set the parameter to # # Always returns the current value of the parameter # # ---------------------------------------------------------------------------- sub parameter { my ( $self, $name, $value ) = @_; if ( defined( $value ) ) { $self->{save_needed__} = 1; $self->{configuration_parameters__}{$name}{value} = $value; if ( $self->{started__} == 0 ) { $self->{configuration_parameters__}{$name}{default} = $value; } } # If $self->{configuration_parameters__}{$name} is undefined, simply # return undef to avoid defining $self->{configuration_parameters__}{$name}. if ( defined($self->{configuration_parameters__}{$name}) ) { return $self->{configuration_parameters__}{$name}{value}; } else { return undef; } } # ---------------------------------------------------------------------------- # # is_default # # Returns whether the parameter has the default value or not # # $name Name of the parameter # # Returns 1 if the parameter still has its default value # # ---------------------------------------------------------------------------- sub is_default { my ( $self, $name ) = @_; return ( $self->{configuration_parameters__}{$name}{value} eq # PROFILE BLOCK START $self->{configuration_parameters__}{$name}{default} ); # PROFILE BLOCK STOP } # GETTERS sub configuration_parameters { my ( $self ) = @_; return sort keys %{$self->{configuration_parameters__}}; } sub deprecated_parameter { my ( $self, $name ) = @_; return $self->{deprecated_parameters__}{$name}; } 1; popfile-1.1.3+dfsg/POPFile/History.pm0000664000175000017500000012714511710356074016620 0ustar danieldaniel# POPFILE LOADABLE MODULE package POPFile::History; use POPFile::Module; @ISA = ("POPFile::Module"); #---------------------------------------------------------------------------- # # This module handles POPFile's history. It manages entries in the POPFile # database and on disk that store messages previously classified by POPFile. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use strict; use warnings; use locale; use Date::Parse; use Digest::MD5 qw( md5_hex ); my $fields_slot = # PROFILE BLOCK START 'history.id, hdr_from, hdr_to, hdr_cc, hdr_subject, hdr_date, hash, inserted, buckets.name, usedtobe, history.bucketid, magnets.val, size'; # PROFILE BLOCK STOP #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = POPFile::Module->new(); # List of committed history items waiting to be committed # into the database, it consists of lists containing three # elements: the slot id, the bucket classified to and the # magnet if used $self->{commit_list__} = (); # Contains queries started with start_query and consists # of a mapping between unique IDs and quadruples containing # a reference to the SELECT and a cache of already fetched # rows and a total row count. These quadruples are implemented # as a sub-hash with keys query, count, cache, fields $self->{queries__} = (); $self->{firsttime__} = 1; # Will contain the database handle retrieved from # Classifier::Bayes $self->{db__} = undef; $self->{classifier__} = 0; bless($self, $class); $self->name( 'history' ); return $self; } #---------------------------------------------------------------------------- # # initialize # # Called to initialize the history module # #---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # Keep the history for two days $self->config_( 'history_days', 2 ); # If 1, Messages are saved to an archive when they are removed or expired # from the history cache $self->config_( 'archive', 0 ); # The directory where messages will be archived to, in sub-directories for # each bucket $self->config_( 'archive_dir', 'archive' ); # This is an advanced setting which will save archived files to a # randomly numbered sub-directory, if set to greater than zero, otherwise # messages will be saved in the bucket directory # # 0 <= directory name < archive_classes $self->config_( 'archive_classes', 0 ); # Need TICKD message for history clean up, COMIT when a message # is committed to the history $self->mq_register_( 'TICKD', $self ); $self->mq_register_( 'COMIT', $self ); return 1; } #---------------------------------------------------------------------------- # # stop # # Called to stop the history module # #---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; # Commit any remaining history items. This is needed because it's # possible that we get called with a stop after things have been # added to the queue and before service() is called $self->commit_history__(); if ( defined( $self->{db__} ) ) { $self->{db__}->disconnect; $self->{db__} = undef; } } #---------------------------------------------------------------------------- # # db__ # # Since we don't know the order in which the start() methods of PLMs # is called we cannot be sure that Classifier::Bayes will have started # and connected to the database before us, hence we can't set our # database handle at start time. So instead we access the db handle # through this method # #---------------------------------------------------------------------------- sub db__ { my ( $self ) = @_; if ( !defined( $self->{db__} ) ) { $self->{db__} = $self->{classifier__}->db()->clone; } return $self->{db__}; } #---------------------------------------------------------------------------- # # service # # Called periodically so that the module can do its work # #---------------------------------------------------------------------------- sub service { my ( $self ) = @_; if ( $self->{firsttime__} ) { $self->upgrade_history_files__(); $self->{firsttime__} = 0; } # Note when we go to multiuser POPFile we'll need to change this call # so that we are sure that the session IDs that it is using are still # valid. The easiest way will be to call it in deliver() when we get # a COMIT message. $self->commit_history__(); return 1; } #---------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # There is no return value from this method # #---------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; # If a day has passed then clean up the history if ( $type eq 'TICKD' ) { $self->cleanup_history(); } if ( $type eq 'COMIT' ) { push ( @{$self->{commit_list__}}, \@message ); } } # --------------------------------------------------------------------------- # # forked # # This is called inside a child process that has just forked, since the # child needs access to the database we open it # # --------------------------------------------------------------------------- sub forked { my ( $self ) = @_; $self->{db__} = undef; } #---------------------------------------------------------------------------- # # ADDING TO THE HISTORY # # To add a message to the history the following sequence of calls # is made: # # 1. Obtain a unique ID and filename for the new message by a call # to reserve_slot # # 2. Write the message into the filename returned # # 3. Call commit_slot with the bucket into which the message was # classified # # If an error occurs after #1 and the slot is unneeded then call # release_slot # #---------------------------------------------------------------------------- # # FINDING A HISTORY ENTRY # # 1. If you know the slot id then call get_slot_file to obtain # the full path where the file is stored # # 2. If you know the message hash then call get_slot_from hash # to get the slot id # # 3. If you know the message headers then use get_message_hash # to get the hash # #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # # reserve_slot # # Called to reserve a place in the history for a message that is in the # process of being received. It returns a unique ID for this slot and # the full path to the file where the message should be stored. The # caller is expected to later call either release_slot (if the slot is not # going to be used) or commit_slot (if the file has been written and the # entry should be added to the history). # # The only parameter is optional and exists for the sake of the test- # suite: you can pass in the time at which the message was inserted, # ie. the time at which the message arrived. #---------------------------------------------------------------------------- sub reserve_slot { my $self = shift; my $inserted_time = shift || time; my $insert_sth = $self->db__()->prepare( # PROFILE BLOCK START 'insert into history ( userid, committed, inserted ) values ( ?, ?, ? );' ); # PROFILE BLOCK STOP my $is_sqlite2 = ( $self->db__()->{Driver}->{Name} =~ /SQLite2?/ ) && # PROFILE BLOCK START ( $self->db__()->{sqlite_version} =~ /^2\./ ); # PROFILE BLOCK STOP my $slot; while ( !defined($slot) || $slot == 0 ) { my $r = int(rand( 1000000000 )+2); $self->log_( 2, "reserve_slot selected random number $r" ); # Get the date/time now which will be stored in the database # so that we can sort on the Date: header in the message and # when we received it my $result = $insert_sth->execute( 1, $r, $inserted_time ); next if ( !defined( $result ) ); if ( $is_sqlite2 ) { $slot = $self->db__()->func( 'last_insert_rowid' ); } else { $slot = $self->db__()->last_insert_id( undef, undef, 'history', 'id' ); } } $insert_sth->finish; $self->log_( 2, "reserve_slot returning slot id $slot" ); return ( $slot, $self->get_slot_file( $slot ) ); } #---------------------------------------------------------------------------- # # release_slot # # See description with reserve_slot; release_slot releases a history slot # previously allocated with reserve_slot and discards it. # # id Unique ID returned by reserve_slot # #---------------------------------------------------------------------------- sub release_slot { my ( $self, $slot ) = @_; # Remove the entry from the database and delete the file # if present my $delete = 'delete from history where history.id = ?;'; my $h = $self->db__()->prepare( $delete ); $h->execute( $slot ); my $file = $self->get_slot_file( $slot ); unlink $file; # It's now possible that the directory for the slot file is empty # and we want to delete it so that things get cleaned up # automatically my $directory = $file; $directory =~ s/popfile[a-f0-9]{2}\.msg$//i; my $depth = 3; while ( $depth > 0 ) { if ( rmdir( $directory ) ) { $directory =~ s![a-f0-9]{2}/$!!i; $depth--; } else { # We either aren't allowed to delete the # directory or it wasn't empty last; } } } #---------------------------------------------------------------------------- # # commit_slot # # See description with reserve_slot; commit_slot commits a history # slot to the database and makes it part of the history. Before this # is called the full message should have been written to the file # returned by reserve_slot. Note that commit_slot queues the message # for insertion and does not commit it until some (short) time later # # session User session with Classifier::Bayes API # slot Unique ID returned by reserve_slot # bucket Bucket classified to # magnet Magnet if used # #---------------------------------------------------------------------------- sub commit_slot { my ( $self, $session, $slot, $bucket, $magnet ) = @_; $self->mq_post_( 'COMIT', $session, $slot, $bucket, $magnet ); } #---------------------------------------------------------------------------- # # change_slot_classification # # Used to 'reclassify' a message by changing its classification in the # database. # # slot The slot to update # class The new classification # session A valid API session # undo If set to 1 then indicates an undo operation # #---------------------------------------------------------------------------- sub change_slot_classification { my ( $self, $slot, $class, $session, $undo ) = @_; $self->log_( 0, "Change slot classification of $slot to $class" ); # Get the bucket ID associated with the new classification # then retrieve the current classification for this slot # and update the database my $bucketid = $self->{classifier__}->get_bucket_id( # PROFILE BLOCK START $session, $class ); # PROFILE BLOCK STOP my $oldbucketid = 0; if ( !$undo ) { my @fields = $self->get_slot_fields( $slot ); $oldbucketid = $fields[10]; } my $h = $self->db__()->prepare( # PROFILE BLOCK START 'update history set bucketid = ?, usedtobe = ? where id = ?;' ); # PROFILE BLOCK STOP $h->execute( $bucketid, $oldbucketid, $slot ); $self->force_requery(); } #---------------------------------------------------------------------------- # # revert_slot_classification # # Used to undo a 'reclassify' a message by changing its classification # in the database. # # slot The slot to update # #---------------------------------------------------------------------------- sub revert_slot_classification { my ( $self, $slot ) = @_; my @fields = $self->get_slot_fields( $slot ); my $oldbucketid = $fields[9]; my $h = $self->db__()->prepare( # PROFILE BLOCK START 'update history set bucketid = ?, usedtobe = ? where id = ?;' ); # PROFILE BLOCK STOP $h->execute( $oldbucketid, 0, $slot ); $self->force_requery(); } #--------------------------------------------------------------------------- # # get_slot_fields # # Returns the fields associated with a specific slot. We return the # same collection of fields as get_query_rows. # # slot The slot id # #--------------------------------------------------------------------------- sub get_slot_fields { my ( $self, $slot ) = @_; return undef if ( !defined( $slot ) || $slot !~ /^\d+$/ ); my $h = $self->db__()->prepare( # PROFILE BLOCK START "select $fields_slot from history, buckets, magnets where history.id = ? and buckets.id = history.bucketid and magnets.id = magnetid and history.committed = 1;" ); # PROFILE BLOCK STOP $h->execute( $slot ); my @result = $h->fetchrow_array; return @result; } #--------------------------------------------------------------------------- # # is_valid_slot # # Returns 1 if the slot ID passed in is valid # # slot The slot id # #--------------------------------------------------------------------------- sub is_valid_slot { my ( $self, $slot ) = @_; return undef if ( !defined( $slot ) || $slot !~ /^\d+$/ ); my $h = $self->db__()->prepare( # PROFILE BLOCK START 'select id from history where history.id = ? and history.committed = 1;' ); # PROFILE BLOCK STOP $h->execute( $slot ); my @row = $h->fetchrow_array; return ( ( @row ) && ( $row[0] == $slot ) ); } #--------------------------------------------------------------------------- # # commit_history__ # # (private) Used internally to commit messages that have been committed # with a call to commit_slot to the database # #---------------------------------------------------------------------------- sub commit_history__ { my ( $self ) = @_; if ( $#{$self->{commit_list__}} == -1 ) { return; } my $update_history = $self->db__()->prepare( # PROFILE BLOCK START 'update history set hdr_from = ?, hdr_to = ?, hdr_date = ?, hdr_cc = ?, hdr_subject = ?, sort_from = ?, sort_to = ?, sort_cc = ?, committed = ?, bucketid = ?, usedtobe = ?, magnetid = ?, hash = ?, size = ? where id = ?;' ); # PROFILE BLOCK STOP $self->db__()->begin_work; foreach my $entry (@{$self->{commit_list__}}) { my ( $session, $slot, $bucket, $magnet ) = @{$entry}; my $file = $self->get_slot_file( $slot ); # Committing to the history requires the following steps # # 1. Parse the message to extract the headers # 2. Compute MD5 hash of Message-ID, Date and Subject # 3. Update the related row with the headers and # committed set to 1 my %header; if ( open FILE, "<$file" ) { my $last; while ( ) { s/[\r\n]//g; if ( /^$/ ) { last; } if ( /^([^ \t]+):[ \t]*(.*)$/ ) { $last = lc $1; push @{$header{$last}}, $2; } else { if ( defined $last ) { ${$header{$last}}[$#{$header{$last}}] .= $_; } } } close FILE; } else { $self->log_( 0, "Could not open history message file $file for reading." ); } my $hash = $self->get_message_hash( ${$header{'message-id'}}[0], ${$header{'date'}}[0], ${$header{'subject'}}[0], ${$header{'received'}}[0] ); # For sorting purposes the From, To and CC headers have special # cleaned up versions of themselves in the database. The idea # is that case and certain characters should be ignored when # sorting these fields # # "John Graham-Cumming" maps to # john graham-cumming spam@jgc.org my @sortable = ( 'from', 'to', 'cc' ); my %sort_headers; foreach my $h (@sortable) { $sort_headers{$h} = # PROFILE BLOCK START $self->{classifier__}->{parser__}->decode_string( ${$header{$h}}[0] ); # PROFILE BLOCK STOP $sort_headers{$h} = lc($sort_headers{$h} || ''); $sort_headers{$h} =~ s/[\"<>]//g; $sort_headers{$h} =~ s/^[ \t]+//g; $sort_headers{$h} =~ s/\0//g; } # Make sure that the headers we are going to insert into # the database have been defined and are suitably quoted my @required = ( 'from', 'to', 'cc', 'subject' ); foreach my $h (@required) { ${$header{$h}}[0] = # PROFILE BLOCK START $self->{classifier__}->{parser__}->decode_string( ${$header{$h}}[0] ); # PROFILE BLOCK STOP if ( !defined ${$header{$h}}[0] || ${$header{$h}}[0] =~ /^\s*$/ ) { if ( $h ne 'cc' ) { ${$header{$h}}[0] = "<$h header missing>"; } else { ${$header{$h}}[0] = ''; } } ${$header{$h}}[0] =~ s/\0//g; } # If we do not have a date header then set the date to # 0 (start of the Unix epoch), otherwise parse the string # using Date::Parse to interpret it and turn it into the # Unix epoch. if ( !defined( ${$header{date}}[0] ) ) { ${$header{date}}[0] = 0; } else { ${$header{date}}[0] = str2time( ${$header{date}}[0] ) || 0; } # Figure out the ID of the bucket this message has been # classified into (and the same for the magnet if it is # defined) my $bucketid = $self->{classifier__}->get_bucket_id( # PROFILE BLOCK START $session, $bucket ); # PROFILE BLOCK STOP my $msg_size = -s $file; # If we can't get the bucket ID because the bucket doesn't exist # which could happen when we are upgrading the history which # has old bucket names in it then we will remove the entry from the # history and log the failure if ( defined( $bucketid ) ) { my $result = $update_history->execute( # PROFILE BLOCK START ${$header{from}}[0], # hdr_from ${$header{to}}[0], # hdr_to ${$header{date}}[0], # hdr_date ${$header{cc}}[0], # hdr_cc ${$header{subject}}[0], # hdr_subject $sort_headers{from}, # sort_from $sort_headers{to}, # sort_to $sort_headers{cc}, # sort_cc 1, # committed $bucketid, # bucketid 0, # usedtobe $magnet, # magnetid $hash, # hash $msg_size, # size $slot # id ); # PROFILE BLOCK STOP } else { $self->log_( 0, "Couldn't find bucket ID for bucket $bucket when committing $slot" ); $self->release_slot( $slot ); } } $self->db__()->commit; $update_history->finish; $self->{commit_list__} = (); $self->force_requery(); } # --------------------------------------------------------------------------- # # delete_slot # # Deletes an entry from the database and disk, optionally archiving it # if the archive parameters have been set # # $slot The slot ID # $archive 1 if it's OK to archive this entry # # --------------------------------------------------------------------------- sub delete_slot { my ( $self, $slot, $archive ) = @_; my $file = $self->get_slot_file( $slot ); $self->log_( 2, "delete_slot called for slot $slot, file $file" ); if ( $archive && $self->config_( 'archive' ) ) { my $path = $self->get_user_path_( $self->config_( 'archive_dir' ), 0 ); $self->make_directory__( $path ); my $b = $self->db__()->selectrow_arrayref( "select buckets.name from history, buckets where history.bucketid = buckets.id and history.id = $slot;" ); my $bucket = $b->[0]; if ( ( $bucket ne 'unclassified' ) && # PROFILE BLOCK START ( $bucket ne 'unknown class' ) ) { # PROFILE BLOCK STOP $path .= "\/" . $bucket; $self->make_directory__( $path ); if ( $self->config_( 'archive_classes' ) > 0) { # Archive to a random sub-directory of the bucket archive my $subdirectory = int( rand( # PROFILE BLOCK START $self->config_( 'archive_classes' ) ) ); # PROFILE BLOCK STOP $path .= "\/" . $subdirectory; $self->make_directory__( $path ); } # Previous comment about this potentially being unsafe # (may have placed messages in unusual places, or # overwritten files) no longer applies. Files are now # placed in the user directory, in the archive_dir # subdirectory $self->copy_file__( $file, $path, "popfile$slot.msg" ); } } # Now remove the entry from the database, and the file from disk, # and also invalidate the caches of any open queries since they # may have been affected $self->release_slot( $slot ); $self->force_requery(); } #---------------------------------------------------------------------------- # # start_deleting # # Called before doing a block of calls to delete_slot. This will call # back into the Classifier::Bayes to tweak the database performance to # make this quick. # #---------------------------------------------------------------------------- sub start_deleting { my ( $self ) = @_; # $self->{classifier__}->tweak_sqlite( 1, 1, $self->db__() ); $self->db__()->begin_work; } #---------------------------------------------------------------------------- # # stop_deleting # # Called after doing a block of calls to delete_slot. This will call # back into the Classifier::Bayes to untweak the database performance. # #---------------------------------------------------------------------------- sub stop_deleting { my ( $self ) = @_; $self->db__()->commit; # $self->{classifier__}->tweak_sqlite( 1, 0, $self->db__() ); } #---------------------------------------------------------------------------- # # get_slot_file # # Used to map a slot ID to the full path of the file will contain # the message associated with the slot # #---------------------------------------------------------------------------- sub get_slot_file { my ( $self, $slot ) = @_; # The mapping between the slot and the file goes as follows: # # 1. Convert the file to an 8 digit hex number (with leading # zeroes). # 2. Call that number aabbccdd # 3. Build the path aa/bb/cc # 4. Name the file popfiledd.msg # 5. Add the msgdir location to obtain # msgdir/aa/bb/cc/popfiledd.msg # # Hence each directory can have up to 256 entries my $hex_slot = sprintf( '%8.8x', $slot ); my $path = $self->get_user_path_( # PROFILE BLOCK START $self->global_config_( 'msgdir' ) . substr( $hex_slot, 0, 2 ) . '/', 0 ); # PROFILE BLOCK STOP $self->make_directory__( $path ); $path .= substr( $hex_slot, 2, 2 ) . '/'; $self->make_directory__( $path ); $path .= substr( $hex_slot, 4, 2 ) . '/'; $self->make_directory__( $path ); my $file = 'popfile' . # PROFILE BLOCK START substr( $hex_slot, 6, 2 ) . '.msg'; # PROFILE BLOCK STOP return $path . $file; } #---------------------------------------------------------------------------- # # get_message_hash # # Used to compute an MD5 hash of the headers of a message # so that the same message can later me identified by a # call to get_slot_from_hash # # messageid The message id header # date The date header # subject The subject header # received First Received header line # # Note that the values passed in are everything after the : in # header without the trailing \r or \n. If a header is missing # then pass in the empty string # #---------------------------------------------------------------------------- sub get_message_hash { my ( $self, $messageid, $date, $subject, $received ) = @_; $messageid = '' if ( !defined( $messageid ) ); $date = '' if ( !defined( $date ) ); $subject = '' if ( !defined( $subject ) ); $received = '' if ( !defined( $received ) ); return md5_hex( "[$messageid][$date][$subject][$received]" ); } #---------------------------------------------------------------------------- # # get_slot_from_hash # # Given a hash value (returned by get_message_hash), find any # corresponding message in the database and return its slot # id. If the message does not exist then return the empty # string. # # hash The hash value # #---------------------------------------------------------------------------- sub get_slot_from_hash { my ( $self, $hash ) = @_; my $h = $self->db__()->prepare( # PROFILE BLOCK START 'select id from history where hash = ? limit 1;' ); # PROFILE BLOCK STOP $h->execute( $hash ); my $result = $h->fetchrow_arrayref; return defined( $result )?$result->[0]:''; } #---------------------------------------------------------------------------- # # QUERYING THE HISTORY # # 1. Start a query session by calling start_query and obtain a unique # ID # # 2. Set the query parameter (i.e. sort, search and filter) with a call # to set_query # # 3. Obtain the number of history rows returned by calling get_query_size # # 4. Get segments of the history returned by calling get_query_rows with # the start and end rows needed # # 5. When finished with the query call stop_query # #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # # start_query # # Used to start a query session, returns a unique ID for this # query. When the caller is done with the query they return # stop_query. # #---------------------------------------------------------------------------- sub start_query { my ( $self ) = @_; # Think of a large random number, make sure that it hasn't # been used and then return it while (1) { my $id = sprintf( '%8.8x', int(rand(4294967295)) ); if ( !defined( $self->{queries__}{$id} ) ) { $self->{queries__}{$id}{query} = 0; $self->{queries__}{$id}{count} = 0; $self->{queries__}{$id}{cache} = (); return $id } } } #---------------------------------------------------------------------------- # # stop_query # # Used to clean up after a query session # # id The ID returned by start_query # #---------------------------------------------------------------------------- sub stop_query { my ( $self, $id ) = @_; # If the cache size hasn't grown to the row # count then we didn't fetch everything and so # we fill call finish to clean up my $q = $self->{queries__}{$id}{query}; if ( ( defined $q ) && ( $q != 0 ) ) { if ( $#{$self->{queries__}{$id}{cache}} != # PROFILE BLOCK START $self->{queries__}{$id}{count} ) { # PROFILE BLOCK STOP $q->finish; undef $self->{queries__}{$id}{query}; } } delete $self->{queries__}{$id}; } #---------------------------------------------------------------------------- # # set_query # # Called to set up a query with sort, filter and search options # # id The ID returned by start_query # filter Name of bucket to filter on # search From/Subject line to search for # sort The field to sort on (from, subject, to, cc, bucket, date) # (optional leading - for descending sort) # not If set to 1 negates the search # #---------------------------------------------------------------------------- sub set_query { my ( $self, $id, $filter, $search, $sort, $not ) = @_; $search =~ s/\0//g; $sort = '' if ( $sort !~ /^(\-)?(inserted|from|to|cc|subject|bucket|date|size)$/ ); # If this query has already been done and is in the cache # then do no work here if ( defined( $self->{queries__}{$id}{fields} ) && # PROFILE BLOCK START ( $self->{queries__}{$id}{fields} eq "$filter:$search:$sort:$not" ) ) { # PROFILE BLOCK STOP return; } $self->{queries__}{$id}{fields} = "$filter:$search:$sort:$not"; # We do two queries, the first to get the total number of rows that # would be returned and then we start the real query. This is done # so that we know the size of the resulting data without having # to retrieve it all $self->{queries__}{$id}{base} = # PROFILE BLOCK START 'select XXX from history, buckets, magnets where history.userid = 1 and committed = 1'; # PROFILE BLOCK STOP $self->{queries__}{$id}{base} .= ' and history.bucketid = buckets.id'; $self->{queries__}{$id}{base} .= ' and magnets.id = magnetid'; # If there's a search portion then add the appropriate clause # to find the from/subject header my $not_word = $not ? 'not' : ''; my $not_equal = $not ? '!=' : '='; my $equal = $not ? '=' : '!='; if ( $search ne '' ) { $search = $self->db__()->quote( '%' . $search . '%' ); $self->{queries__}{$id}{base} .= " and $not_word ( hdr_from like $search or hdr_subject like $search )"; } # If there's a filter option then we'll need to get the bucket # id for the filtered bucket and add the appropriate clause if ( $filter ne '' ) { if ( $filter eq '__filter__magnet' ) { $self->{queries__}{$id}{base} .= # PROFILE BLOCK START " and history.magnetid $equal 0"; # PROFILE BLOCK STOP } else { if ( $filter eq '__filter__reclassified' ) { $self->{queries__}{$id}{base} .= # PROFILE BLOCK START " and history.usedtobe $equal 0"; # PROFILE BLOCK STOP } else { my $bucket = $self->db__()->quote( $filter ); $self->{queries__}{$id}{base} .= " and buckets.name $not_equal $bucket"; } } } # Add the sort option (if there is one) if ( $sort ne '' ) { $sort =~ s/^(\-)//; my $direction = defined($1)?'desc':'asc'; if ( $sort eq 'bucket' ) { $sort = 'buckets.name'; } else { if ( $sort =~ /from|to|cc/ ) { $sort = "sort_$sort"; } else { if ( $sort ne 'inserted' && $sort ne 'size' ) { $sort = "hdr_$sort"; } } } $self->{queries__}{$id}{base} .= " order by $sort $direction;"; } else { $self->{queries__}{$id}{base} .= ' order by inserted desc;'; } my $count = $self->{queries__}{$id}{base}; $self->log_( 2, "Base query is $count" ); $count =~ s/XXX/COUNT(*)/; my $h = $self->db__()->prepare( $count ); $h->execute; $self->{queries__}{$id}{count} = $h->fetchrow_arrayref->[0]; $h->finish; my $select = $self->{queries__}{$id}{base}; $select =~ s/XXX/$fields_slot/; $self->{queries__}{$id}{query} = $self->db__()->prepare( $select ); $self->{queries__}{$id}{cache} = (); } #---------------------------------------------------------------------------- # # delete_query # # Called to delete all the rows returned in a query # # id The ID returned by start_query # #---------------------------------------------------------------------------- sub delete_query { my ( $self, $id ) = @_; $self->start_deleting(); my $delete = $self->{queries__}{$id}{base}; $delete =~ s/XXX/history.id/; my $d = $self->db__()->prepare( $delete ); $d->execute; my $history_id; my @row; my @ids; $d->bind_columns( \$history_id ); while ( $d->fetchrow_arrayref ) { push ( @ids, $history_id ); } foreach my $id (@ids) { $self->delete_slot( $id, 1 ); } $self->stop_deleting(); } #---------------------------------------------------------------------------- # # get_query_size # # Called to return the number of elements in the query. # Should only be called after a call to set_query. # # id The ID returned by start_query # #---------------------------------------------------------------------------- sub get_query_size { my ( $self, $id ) = @_; return $self->{queries__}{$id}{count}; } #---------------------------------------------------------------------------- # # get_query_rows # # Returns the rows in the range [$start, $end) from a query that has # already been set up with a call to set_query. The first row is row 1. # # id The ID returned by start_query # start The first row to return # count Number of rows to return # # Each row contains the fields: # # id (0), from (1), to (2), cc (3), subject (4), date (5), hash (6), # inserted date (7), bucket name (8), reclassified id (9), bucket id (10), # magnet value (11), size (12) #---------------------------------------------------------------------------- sub get_query_rows { my ( $self, $id, $start, $count ) = @_; # First see if we have already retrieved these rows from the query # if we have then we can just return them from the cache. Otherwise # fetch the rows from the database and then return them my $size = $#{$self->{queries__}{$id}{cache}}+1; $self->log_( 2, "Request for rows $start ($count), current size $size" ); if ( ( $size < ( $start + $count - 1 ) ) ) { my $rows = $start + $count - $size; $self->log_( 2, "Getting $rows rows from database" ); $self->{queries__}{$id}{query}->execute; $self->{queries__}{$id}{cache} = # PROFILE BLOCK START $self->{queries__}{$id}{query}->fetchall_arrayref( undef, $start + $count - 1 ); # PROFILE BLOCK STOP $self->{queries__}{$id}{query}->finish; } my ( $from, $to ) = ( $start-1, $start+$count-2 ); $self->log_( 2, "Returning $from..$to" ); return @{$self->{queries__}{$id}{cache}}[$from..$to]; } # --------------------------------------------------------------------------- # # make_directory__ # # Wrapper for mkdir that ensures that the path we are making doesn't end in # / or \ (Done because your can't do mkdir 'foo/' on NextStep. # # $path The directory to make # # Returns whatever mkdir returns # # --------------------------------------------------------------------------- sub make_directory__ { my ( $self, $path ) = @_; $path =~ s/[\\\/]$//; return 1 if ( -d $path ); return mkdir( $path ); } # --------------------------------------------------------------------------- # # compare_mf__ # # Compares two mailfiles, used for sorting mail into order # # --------------------------------------------------------------------------- sub compare_mf__ { $a =~ /popfile(\d+)=(\d+)\.msg/; my ( $ad, $am ) = ( $1, $2 ); $b =~ /popfile(\d+)=(\d+)\.msg/; my ( $bd, $bm ) = ( $1, $2 ); if ( $ad == $bd ) { return ( $bm <=> $am ); } else { return ( $bd <=> $ad ); } } # --------------------------------------------------------------------------- # # upgrade_history_files__ # # Looks for old .MSG/.CLS history entries and sticks them in the database # # --------------------------------------------------------------------------- sub upgrade_history_files__ { my ( $self ) = @_; # See if there are any .MSG files in the msgdir, and if there are # upgrade them by placing them in the database my @msgs = sort compare_mf__ glob $self->get_user_path_( # PROFILE BLOCK START $self->global_config_( 'msgdir' ) . 'popfile*.msg', 0 ); # PROFILE BLOCK STOP if ( $#msgs != -1 ) { my $session = $self->{classifier__}->get_session_key( 'admin', '' ); print "\nFound old history files, moving them into database\n "; my $i = 0; $self->db__()->begin_work; foreach my $msg (@msgs) { if ( ( ++$i % 100 ) == 0 ) { print "[$i]"; flush STDOUT; } # NOTE. We drop the information in $usedtobe, so that # reclassified messages will no longer appear reclassified # in upgraded history. Also the $magnet is ignored so # upgraded history will have no magnet information. my ( $reclassified, $bucket, $usedtobe, $magnet ) = # PROFILE BLOCK START $self->history_read_class__( $msg ); # PROFILE BLOCK STOP if ( $bucket ne 'unknown_class' ) { my ( $slot, $file ) = $self->reserve_slot(); rename $msg, $file; my @message = ( $session, $slot, $bucket, 0 ); push ( @{$self->{commit_list__}}, \@message ); } } $self->db__()->commit; print "\nDone upgrading history\n"; $self->commit_history__(); $self->{classifier__}->release_session_key( $session ); unlink $self->get_user_path_( # PROFILE BLOCK START $self->global_config_( 'msgdir' ) . 'history_cache', 0 ); # PROFILE BLOCK STOP } } # --------------------------------------------------------------------------- # # history_read_class__ - load and delete the class file for a message. # # returns: ( reclassified, bucket, usedtobe, magnet ) # values: # reclassified: boolean, true if message has been reclassified # bucket: string, the bucket the message is in presently, # unknown class if an error occurs # usedtobe: string, the bucket the message used to be in # (null if not reclassified) # magnet: string, the magnet # # $filename The name of the message to load the class for # # --------------------------------------------------------------------------- sub history_read_class__ { my ( $self, $filename ) = @_; $filename =~ s/msg$/cls/; my $reclassified = 0; my $bucket = 'unknown class'; my $usedtobe; my $magnet = ''; if ( open CLASS, "<$filename" ) { $bucket = ; if ( defined( $bucket ) && # PROFILE BLOCK START ( $bucket =~ /([^ ]+) MAGNET ([^\r\n]+)/ ) ) { # PROFILE BLOCK STOP $bucket = $1; $magnet = $2; } $reclassified = 0; if ( defined( $bucket ) && ( $bucket =~ /RECLASSIFIED/ ) ) { $bucket = ; $usedtobe = ; $reclassified = 1; $usedtobe =~ s/[\r\n]//g; } close CLASS; $bucket =~ s/[\r\n]//g if defined( $bucket ); unlink $filename; } else { return ( undef, $bucket, undef, undef ); } $bucket = 'unknown class' if ( !defined( $bucket ) ); return ( $reclassified, $bucket, $usedtobe, $magnet ); } #---------------------------------------------------------------------------- # # cleanup_history # # Removes the popfile*.msg files that are older than a number of days # configured as history_days. # #---------------------------------------------------------------------------- sub cleanup_history { my ( $self ) = @_; my $seconds_per_day = 24 * 60 * 60; my $old = time - $self->config_( 'history_days' ) * $seconds_per_day; my @ids; my $d = $self->db__()->prepare( # PROFILE BLOCK START 'select id from history where inserted < ?;' ); # PROFILE BLOCK STOP $d->execute( $old ); my $id; $d->bind_columns( \$id ); while ( $d->fetchrow_arrayref ) { push ( @ids, $id ); } $d->finish; foreach my $id (@ids) { $self->delete_slot( $id, 1 ); } } # --------------------------------------------------------------------------- # # copy_file__ # # Utility to copy a file and ensure that the path it is going to # exists # # $from Where to copy from # $to_dir The directory it will be copied to # $to_name The name of the destination (without the directory) # # --------------------------------------------------------------------------- sub copy_file__ { my ( $self, $from, $to_dir, $to_name ) = @_; if ( open( FROM, "<$from") ) { if ( open( TO, ">$to_dir\/$to_name") ) { binmode FROM; binmode TO; while () { print TO $_; } close TO; } close FROM; } } # --------------------------------------------------------------------------- # # force_requery # # Called when the database has changed to invalidate any queries that are # open so that cached data is not returned and the database is requeried # # --------------------------------------------------------------------------- sub force_requery { my ( $self ) = @_; # Force requery since the messages have changed foreach my $id (keys %{$self->{queries__}}) { $self->{queries__}{$id}{fields} = ''; } } # SETTER sub classifier { my ( $self, $classifier ) = @_; $self->{classifier__} = $classifier; } 1; popfile-1.1.3+dfsg/POPFile/Loader.pm0000664000175000017500000007302411710356074016361 0ustar danieldanielpackage POPFile::Loader; #---------------------------------------------------------------------------- # # Loader.pm --- API for loading POPFile loadable modules and # encapsulating POPFile application tasks # # Subroutine names beginning with CORE indicate a subroutine designed # for exclusive use of POPFile's core application (popfile.pl). # # Subroutines not so marked are suitable for use by POPFile-based # utilities to assist in loading and executing modules # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Created by Sam Schinke (sschinke@users.sourceforge.net) # #---------------------------------------------------------------------------- use Getopt::Long qw(:config pass_through); #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self; # The POPFile classes are stored by reference in the components # hash, the top level key is the type of the component (see # CORE_load_directory_modules) and then the name of the component # derived from calls to each loadable modules name() method and # which points to the actual module $self->{components__} = {}; # A handy boolean that tells us whether we are alive or not. When # this is set to 1 then the proxy works normally, when set to 0 # (typically by the aborting() function called from a signal) then # we will terminate gracefully $self->{alive__} = 1; # This must be 1 for POPFile::Loader to create any output on STDOUT $self->{debug__} = 1; # If this is set to 1 then POPFile will shutdown straight after it # has started up. This is used by the installer and set by the # --shutdown command-line option $self->{shutdown__} = 0; # This stuff lets us do some things in a way that tolerates some # window-isms $self->{on_windows__} = 0; if ( $^O eq 'MSWin32' ) { require v5.8.0; $self->{on_windows__} = 1; } # See CORE_loader_init below for an explanation of these $self->{aborting__} = ''; $self->{pipeready__} = ''; $self->{forker__} = ''; $self->{reaper__} = ''; $self->{childexit__} = ''; $self->{warning__} = ''; $self->{die__} = ''; # POPFile's version number as individual numbers and as # string $self->{major_version__} = '?'; $self->{minor_version__} = '?'; $self->{build_version__} = '?'; $self->{version_string__} = ''; # Where POPFile is installed $self->{popfile_root__} = './'; bless $self, $type; return $self; } #---------------------------------------------------------------------------- # # CORE_loader_init # # Initialize things only needed in CORE # #---------------------------------------------------------------------------- sub CORE_loader_init { my ( $self ) = @_; if ( defined( $ENV{POPFILE_ROOT} ) ) { $self->{popfile_root__} = $ENV{POPFILE_ROOT}; } # These anonymous subroutine references allow us to call these important # functions from anywhere using the reference, granting internal access # to $self, without exposing $self to the unwashed. No reference to # POPFile::Loader is needed by the caller $self->{aborting__} = sub { $self->CORE_aborting(@_) }; $self->{pipeready__} = sub { $self->pipeready(@_) }; $self->{forker__} = sub { $self->CORE_forker(@_) }; $self->{reaper__} = sub { $self->CORE_reaper(@_) }; $self->{childexit__} = sub { $self->CORE_childexit(@_) }; $self->{warning__} = sub { $self->CORE_warning(@_) }; $self->{die__} = sub { $self->CORE_die(@_) }; # See if there's a file named popfile_version that contains the # POPFile version number my $version_file = $self->root_path__( 'POPFile/popfile_version' ); if ( -e $version_file ) { open VER, "<$version_file"; my $major = int(); my $minor = int(); my $rev = int(); close VER; $self->CORE_version( $major, $minor, $rev ); } # Parse the command-line options (only --shutdown is supported at present) GetOptions( "shutdown" => \$self->{shutdown__} ); print "\nPOPFile Engine loading\n" if $self->{debug__}; } #---------------------------------------------------------------------------- # # CORE_aborting # # Called if we are going to be aborted or are being asked to abort our # operation. Sets the alive flag to 0 that will cause us to abort at # the next convenient moment # #---------------------------------------------------------------------------- sub CORE_aborting { my ( $self ) = @_; $self->{alive__} = 0; foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->alive(0); } } } #---------------------------------------------------------------------------- # # pipeready # # Returns 1 if there is data available to be read on the passed in # pipe handle # # $pipe Pipe handle # #---------------------------------------------------------------------------- sub pipeready { my ( $self, $pipe ) = @_; # Check that the $pipe is still a valid handle if ( !defined( $pipe ) ) { return 0; } if ( $self->{on_windows__} ) { # I am NOT doing a select() here because that does not work # on Perl running on Windows. -s returns the "size" of the file # (in this case a pipe) and will be non-zero if there is data to read return ( ( -s $pipe ) > 0 ); } else { # Here I do a select because we are not running on Windows where # you can't select() on a pipe my $rin = ''; vec( $rin, fileno( $pipe ), 1 ) = 1; my $ready = select( $rin, undef, undef, 0.01 ); return ( $ready > 0 ); } } #---------------------------------------------------------------------------- # # CORE_reaper # # Called if we get SIGCHLD and asks each module to do whatever reaping # is needed # #---------------------------------------------------------------------------- sub CORE_reaper { my ( $self ) = @_; foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->reaper(); } } $SIG{CHLD} = $self->{reaper__}; } #---------------------------------------------------------------------------- # # CORE_childexit # # Called by a module that is in a child process and wants to exit. This # warns all the other modules in the same process by calling their childexit # function and then does the exit. # # $code The process exit code # #---------------------------------------------------------------------------- sub CORE_childexit { my ( $self, $code ) = @_; foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->childexit(); } } exit( $code ); } #---------------------------------------------------------------------------- # # CORE_forker # # Called to fork POPFile. Calls every module's forked function in the # child process to give then a chance to clean up # # Returns the return value from fork() and a file handle that form a # pipe in the direction child to parent. There is no need to close # the file handles that are unused as would normally be the case with # a pipe and fork as forker takes care that in each process only one # file handle is open (be it the reader or the writer) # #---------------------------------------------------------------------------- sub CORE_forker { my ( $self ) = @_; my @types = sort keys %{$self->{components__}}; # Tell all the modules that a fork is about to happen foreach my $type ( @types ) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->prefork(); } } # Create the pipe that will be used to send data from the child to # the parent process, $writer will be returned to the child # process and $reader to the parent process pipe my $reader, my $writer; my $pid = fork(); # If fork() returns an undefined value then we failed to fork and are # in serious trouble (probably out of resources) so we return undef if ( !defined( $pid ) ) { close $reader; close $writer; return (undef, undef); } # If fork returns a PID of 0 then we are in the child process so # close the reading pipe file handle, inform all modules that are # fork has occurred and then return 0 as the PID so that the # caller knows that we are in the child if ( $pid == 0 ) { foreach my $type ( @types ) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->forked( $writer ); } } close $reader; # Set autoflush on the write handle so that output goes # straight through to the parent without buffering it until # the socket closes use IO::Handle; $writer->autoflush(1); return (0, $writer); } # Reach here because we are in the parent process, close out the # writer pipe file handle and return our PID (non-zero) indicating # that this is the parent process foreach my $type ( @types ) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->postfork( $pid, $reader ); } } close $writer; return ($pid, $reader); } #---------------------------------------------------------------------------- # # CORE_warning # # Called when a warning occurs. # Output the warning to the log file and print it to STDERR. # #---------------------------------------------------------------------------- sub CORE_warning { my ( $self, @message ) = @_; if ( $self->module_config( 'GLOBAL', 'debug' ) > 0 ) { $self->{components__}{core}{logger}->debug( 0, "Perl warning: @message" ); warn @message; } } #---------------------------------------------------------------------------- # # CORE_die # # Called when a fatal error occurs. # Output the error message to the log file and exit. # #---------------------------------------------------------------------------- sub CORE_die { my ( $self, @message ) = @_; # Do nothing when dies in eval return if $^S; # Print error message print STDERR @message; if ( $self->module_config( 'GLOBAL', 'debug' ) > 0 ) { $self->{components__}{core}{logger}->debug( 0, "Perl fatal error : @message" ); } # Try to stop safely $self->CORE_stop( ); exit 1; } #---------------------------------------------------------------------------- # # CORE_load_directory_modules # # Called to load all the POPFile Loadable Modules (implemented as .pm # files with special comment on first line) in a specific subdirectory # and loads them into a structured components hash # # $directory The directory to search for loadable modules # $type The 'type' of module being loaded (e.g. proxy, core, ui) which # is used when fixing up references between modules (e.g. proxy # modules all need access to the classifier module) and for # structuring components hash # #---------------------------------------------------------------------------- sub CORE_load_directory_modules { my ( $self, $directory, $type ) = @_; print "\n {$type:" if $self->{debug__}; # Look for all the .pm files in named directory and then see which # of them are POPFile modules indicated by the first line of the # file being and comment (# POPFILE LOADABLE MODULE) and load that # module into the %{$self->{components__}} hash getting the name # from the module by calling name() opendir MODULES, $self->root_path__( $directory ); while ( my $entry = readdir MODULES ) { if ( $entry =~ /\.pm$/ ) { $self->CORE_load_module( "$directory/$entry", $type ); } } closedir MODULES; print '} ' if $self->{debug__}; } #---------------------------------------------------------------------------- # # CORE_load_module # # Called to load a single POPFile Loadable Module (implemented as .pm # files with special comment on first line) and add it to the # components hash. # # Returns a handle to the module # # $module The path of the module to load # $type The 'type' of module being loaded (e.g. proxy, core, ui) # #---------------------------------------------------------------------------- sub CORE_load_module { my ( $self, $module, $type ) = @_; my $mod = $self->load_module_($module); if ( defined( $mod ) ) { my $name = $mod->name(); print " $name" if $self->{debug__}; $self->{components__}{$type}{$name} = $mod; } return $mod; } #---------------------------------------------------------------------------- # # load_module_ # # Called to load a single POPFile Loadable Module (implemented as .pm # files with special comment on first line. Returns a handle to the # module, undef if the module failed to load. No internal # side-effects. # # $module The path of the module to load # #---------------------------------------------------------------------------- sub load_module_ { my ( $self, $module ) = @_; my $mod; if ( open MODULE, '<' . $self->root_path__( $module ) ) { my $first = ; close MODULE; if ( $first =~ /^# POPFILE LOADABLE MODULE/ ) { require $module; $module =~ s/\//::/; $module =~ s/\.pm//; $mod = $module->new(); } } return $mod; } #---------------------------------------------------------------------------- # # CORE_signals # # Sets signals to ensure that POPFile handles OS and IPC events # # TODO: Figure out why windows POPFile doesn't seem to get SIGTERM # when windows shuts down # #---------------------------------------------------------------------------- sub CORE_signals { my ( $self ) = @_; # Redefine POPFile's signals $SIG{QUIT} = $self->{aborting__}; $SIG{ABRT} = $self->{aborting__}; $SIG{KILL} = $self->{aborting__}; $SIG{STOP} = $self->{aborting__}; $SIG{TERM} = $self->{aborting__}; $SIG{INT} = $self->{aborting__}; # Yuck. On Windows SIGCHLD isn't calling the reaper under # ActiveState 5.8.0 so we detect Windows and ignore SIGCHLD and # call the reaper code below $SIG{CHLD} = $self->{on_windows__}?'IGNORE':$self->{reaper__}; # I've seen spurious ALRM signals happen on Windows so here we for # safety say that we want to ignore them $SIG{ALRM} = 'IGNORE'; # Ignore broken pipes $SIG{PIPE} = 'IGNORE'; # Better handling of the Perl warnings $SIG{__WARN__} = $self->{warning__}; # Try to capture the Perl errors $SIG{__DIE__} = $self->{die__}; return $SIG; } #---------------------------------------------------------------------------- # # CORE_platform_ # # Loads POPFile's platform-specific code # #---------------------------------------------------------------------------- sub CORE_platform_ { my ( $self ) = @_; # Look for a module called Platform:: where # is the value of $^O and if it exists then load it as a component # of POPFile. IN this way we can have platform specific code (or # not) encapsulated. Note that such a module needs to be a # POPFile Loadable Module and a subclass of POPFile::Module to # operate correctly my $platform = $^O; if ( -e $self->root_path__( "Platform/$platform.pm" ) ) { print "\n {core:" if $self->{debug__}; $self->CORE_load_module( "Platform/$platform.pm",'core'); print "}" if $self->{debug__}; } } #---------------------------------------------------------------------------- # # CORE_load # # Loads POPFile's modules # # noserver Set to 1 if no servers (i.e. UI and proxies) # #---------------------------------------------------------------------------- sub CORE_load { my ( $self, $noserver ) = @_; # Create the main objects that form the core of POPFile. Consists # of the configuration modules, the classifier, the UI (currently # HTML based), and the proxies. print "\n Loading... " if $self->{debug__}; # Do our platform-specific stuff $self->CORE_platform_(); # populate our components hash $self->CORE_load_directory_modules( 'POPFile', 'core' ); $self->CORE_load_directory_modules( 'Classifier', 'classifier' ); if ( !$noserver ) { $self->CORE_load_directory_modules( 'UI', 'interface' ); $self->CORE_load_directory_modules( 'Proxy', 'proxy' ); $self->CORE_load_directory_modules( 'Services', 'services' ); } } #---------------------------------------------------------------------------- # # CORE_link_components # # Links POPFile's modules together to allow them to make use of # each-other as objects # #---------------------------------------------------------------------------- sub CORE_link_components { my ( $self ) = @_; print "\n\nPOPFile Engine $self->{version_string__} starting" if $self->{debug__}; # Link each of the main objects with the configuration object so # that they can set their default parameters all or them also get # access to the logger, version, and message-queue foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->version( scalar($self->CORE_version()) ); $self->{components__}{$type}{$name}->configuration( $self->{components__}{core}{config} ); $self->{components__}{$type}{$name}->logger( $self->{components__}{core}{logger} ) if ( $name ne 'logger' ); $self->{components__}{$type}{$name}->mq( $self->{components__}{core}{mq} ); } } # All interface components need access to the classifier and history foreach my $name (sort keys %{$self->{components__}{interface}}) { $self->{components__}{interface}{$name}->classifier( $self->{components__}{classifier}{bayes} ); $self->{components__}{interface}{$name}->history( $self->{components__}{core}{history} ); } foreach my $name (sort keys %{$self->{components__}{proxy}}) { $self->{components__}{proxy}{$name}->classifier( $self->{components__}{classifier}{bayes} ); $self->{components__}{proxy}{$name}->history( $self->{components__}{core}{history} ); } foreach my $name (sort keys %{$self->{components__}{services}}) { $self->{components__}{services}{$name}->classifier( $self->{components__}{classifier}{bayes} ); $self->{components__}{services}{$name}->history( $self->{components__}{core}{history} ); } # Classifier::Bayes and POPFile::History are friends and are aware # of one another $self->{components__}{core}{history}->classifier( $self->{components__}{classifier}{bayes} ); $self->{components__}{classifier}{bayes}->history( $self->{components__}{core}{history} ); $self->{components__}{classifier}{bayes}->{parser__}->mangle( $self->{components__}{classifier}{wordmangle} ); } #---------------------------------------------------------------------------- # # CORE_initialize # # Loops across POPFile's modules and initializes them # #---------------------------------------------------------------------------- sub CORE_initialize { my ( $self ) = @_; print "\n\n Initializing... " if $self->{debug__}; # Tell each module to initialize itself # Make sure that the core is started first. my @c = ( 'core', grep {!/^core$/} sort keys %{$self->{components__}} ); foreach my $type (@c) { print "\n {$type:" if $self->{debug__}; foreach my $name (sort keys %{$self->{components__}{$type}}) { print " $name" if $self->{debug__}; flush STDOUT; my $mod = $self->{components__}{$type}{$name}; my $code = $mod->initialize(); if ( $code == 0 ) { die "Failed to start while initializing the $name module"; } if ( $code == 1 ) { $mod->alive( 1 ); $mod->forker( $self->{forker__} ); $mod->setchildexit( $self->{childexit__} ); $mod->pipeready( $self->{pipeready__} ); } } print '} ' if $self->{debug__}; } print "\n" if $self->{debug__}; } #---------------------------------------------------------------------------- # # CORE_config # # Loads POPFile's configuration and command-line settings # #---------------------------------------------------------------------------- sub CORE_config { my ( $self ) = @_; # Load the configuration from disk and then apply any command line # changes that override the saved configuration $self->{components__}{core}{config}->load_configuration(); return $self->{components__}{core}{config}->parse_command_line(); } #---------------------------------------------------------------------------- # # CORE_start # # Loops across POPFile's modules and starts them # #---------------------------------------------------------------------------- sub CORE_start { my ( $self ) = @_; print "\n Starting... " if $self->{debug__}; # Now that the configuration is set tell each module to begin operation # Make sure that the core is started first. my @c = ( 'core', grep {!/^core$/} sort keys %{$self->{components__}} ); foreach my $type (@c) { print "\n {$type:" if $self->{debug__}; foreach my $name (sort keys %{$self->{components__}{$type}}) { my $code = $self->{components__}{$type}{$name}->start(); if ( $code == 0 ) { die "Failed to start while starting the $name module"; } # If the module said that it didn't want to be loaded then # unload it. if ( $code == 2 ) { delete $self->{components__}{$type}{$name}; } else { print " $name" if $self->{debug__}; flush STDOUT; } } print '} ' if $self->{debug__}; } print "\n\nPOPFile Engine ", scalar($self->CORE_version()), " running\n" if $self->{debug__}; flush STDOUT; } #---------------------------------------------------------------------------- # # CORE_service # # This is POPFile. Loops across POPFile's modules and executes their # service subroutines then sleeps briefly # # $nowait If 1 then don't sleep and don't loop # #---------------------------------------------------------------------------- sub CORE_service { my ( $self, $nowait ) = @_; $nowait = 0 if ( !defined( $nowait ) ); # MAIN LOOP - Call each module's service() method to all it to # handle its own requests while ( $self->{alive__} == 1 ) { foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { if ( $self->{components__}{$type}{$name}->service() == 0 ) { $self->{alive__} = 0; last; } } } # Sleep for 0.05 of a second to ensure that POPFile does not # hog the machine's CPU select(undef, undef, undef, 0.05) if !$nowait; # If we are on Windows then reap children here if ( $self->{on_windows__} ) { foreach my $type (sort keys %{$self->{components__}}) { foreach my $name (sort keys %{$self->{components__}{$type}}) { $self->{components__}{$type}{$name}->reaper(); } } } last if $nowait; # If we are asked to shutdown then we allow a single run # through the service routines and then exit if ( $self->{shutdown__} == 1 ) { $self->{alive__} = 0; } } return $self->{alive__}; } #---------------------------------------------------------------------------- # # CORE_stop # # Loops across POPFile's modules and stops them # #---------------------------------------------------------------------------- sub CORE_stop { my ( $self ) = @_; if ( $self->{debug__} ) { print "\n\nPOPFile Engine $self->{version_string__} stopping\n"; flush STDOUT; print "\n Stopping... "; } # Shutdown the MQ first. This is done so that it will flush out # any remaining messages and hand them off to the other modules # that might want to deal with them in their stop() routine $self->{components__}{core}{mq}->alive(0); $self->{components__}{core}{mq}->stop(); $self->{components__}{core}{history}->alive(0); $self->{components__}{core}{history}->stop(); # Shutdown all the modules foreach my $type (sort keys %{$self->{components__}}) { print "\n {$type:" if $self->{debug__}; foreach my $name (sort keys %{$self->{components__}{$type}}) { print " $name" if $self->{debug__}; flush STDOUT; next if ( $name eq 'mq' ); next if ( $name eq 'history' ); $self->{components__}{$type}{$name}->alive(0); $self->{components__}{$type}{$name}->stop(); } print '} ' if $self->{debug__}; } print "\n\nPOPFile Engine $self->{version_string__} terminated\n" if $self->{debug__}; } #---------------------------------------------------------------------------- # # CORE_version # # Gets and Sets POPFile's version data. Returns string in scalar # context, or (major, minor, build) triplet in list context # # $major_version The major version number # $minor_version The minor version number # $build_version The build version number # #---------------------------------------------------------------------------- sub CORE_version { my ( $self, $major_version, $minor_version, $build_version ) = @_; if (!defined($major_version)) { if (wantarray) { return ($self->{major_version__},$self->{minor_version__},$self->{build_version__}); } else { return $self->{version_string__}; } } else { ($self->{major_version__}, $self->{minor_version__}, $self->{build_version__}) = ($major_version, $minor_version, $build_version); $self->{version_string__} = "v$major_version.$minor_version.$build_version" } } #---------------------------------------------------------------------------- # # get_module # # Gets a module from components hash. Returns a handle to a module. # # May be called either as: # # $name Module name in scoped format (eg, Classifier::Bayes) # # Or: # # $name Name of the module # $type The type of module # #---------------------------------------------------------------------------- sub get_module { my ( $self, $name, $type ) = @_; if (!defined($type) && $name =~ /^(.*)::(.*)$/ ) { $type = lc($1); $name = lc($2); $type =~ s/^POPFile$/core/i; $type =~ s/^UI$/interface/i; } return $self->{components__}{$type}{$name}; } #---------------------------------------------------------------------------- # # set_module # # Inserts a module into components hash. # # $name Name of the module # $type The type of module # $module A handle to a module # #---------------------------------------------------------------------------- sub set_module { my ($self, $type, $name, $module) = @_; $self->{components__}{$type}{$name} = $module; } #---------------------------------------------------------------------------- # # remove_module # # removes a module from components hash. # # $name Name of the module # $type The type of module # $module A handle to a module # #---------------------------------------------------------------------------- sub remove_module { my ($self, $type, $name) = @_; $self->{components__}{$type}{$name}->stop(); delete($self->{components__}{$type}{$name}); } #---------------------------------------------------------------------------- # # root_path__ # # Joins the path passed in with the POPFile root # # $path RHS of path # #---------------------------------------------------------------------------- sub root_path__ { my ( $self, $path ) = @_; $self->{popfile_root__} =~ s/[\/\\]$//; $path =~ s/^[\/\\]//; return "$self->{popfile_root__}/$path"; } # GETTER/SETTER sub debug { my ( $self, $debug ) = @_; $self->{debug__} = $debug; } sub module_config { my ( $self, $module, $item, $value ) = @_; return $self->{components__}{core}{config}->module_config_( $module, $item, $value ); } 1; popfile-1.1.3+dfsg/POPFile/Logger.pm0000664000175000017500000002151411710356074016367 0ustar danieldaniel# POPFILE LOADABLE MODULE package POPFile::Logger; use POPFile::Module; @ISA = ("POPFile::Module"); #---------------------------------------------------------------------------- # # This module handles POPFile's logger. It is used to save debugging # information to disk or to send it to the screen. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use strict; use warnings; use locale; # Constant used by the log rotation code my $seconds_per_day = 60 * 60 * 24; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = POPFile::Module->new(); # The name of the debug file $self->{debug_filename__} = ''; # The last ten lines sent to the logger $self->{last_ten__} = (); $self->{initialize_called__} = 0; bless($self, $class); $self->name( 'logger' ); return $self; } #---------------------------------------------------------------------------- # # initialize # # Called to initialize the interface # # --------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; $self->{initialize_called__} = 1; # Start with debugging to file $self->global_config_( 'debug', 1 ); # The default location for log files $self->config_( 'logdir', './' ); # The output format for log files, can be default, tabbed or csv $self->config_( 'format', 'default' ); # The log level. There are three levels of log: # # 0 Critical log messages # 1 Verbose logging # 2 Maximum verbosity $self->config_( 'level', 0 ); $self->{last_tickd__} = time; $self->mq_register_( 'TICKD', $self ); return 1; } # --------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # There is no return value from this method # # --------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; # If a day has passed then clean up log files if ( $type eq 'TICKD' ) { $self->remove_debug_files(); } } #---------------------------------------------------------------------------- # # start # # Called to start the logger running # #---------------------------------------------------------------------------- sub start { my ( $self ) = @_; $self->calculate_today__(); $self->debug( 0, '-----------------------' ); $self->debug( 0, 'POPFile ' . $self->version() . ' starting' ); return 1; } #---------------------------------------------------------------------------- # # stop # # Called to stop the logger module # #---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; $self->debug( 0, 'POPFile stopped' ); $self->debug( 0, '---------------' ); } # --------------------------------------------------------------------------- # # service # # --------------------------------------------------------------------------- sub service { my ( $self ) = @_; $self->calculate_today__(); # We send out a TICKD message every hour so that other modules # can do clean up tasks that need to be done regularly but not # often if ( $self->time > ( $self->{last_tickd__} + 3600 ) ) { $self->mq_post_( 'TICKD' ); $self->{last_tickd__} = $self->time; } return 1; } # --------------------------------------------------------------------------- # # time # # Does the same as the built-in time function but can be overriden # by the test suite to trick the module into thinking that a lot # of time has passed. # # --------------------------------------------------------------------------- sub time { return time; } # --------------------------------------------------------------------------- # # calculate_today # # Set the global $self->{today} variable to the current day in seconds # # --------------------------------------------------------------------------- sub calculate_today__ { my ( $self ) = @_; # Create the name of the debug file for the debug() function $self->{today__} = int( $self->time / $seconds_per_day ) * $seconds_per_day; # just to make this work in Eclipse: / # Note that 0 parameter than allows the logdir to be outside the user # sandbox $self->{debug_filename__} = $self->get_user_path_( # PROFILE BLOCK START $self->config_( 'logdir' ) . "popfile$self->{today__}.log", 0 ); # PROFILE BLOCK STOP } # --------------------------------------------------------------------------- # # remove_debug_files # # Removes popfile log files that are older than 3 days # # --------------------------------------------------------------------------- sub remove_debug_files { my ( $self ) = @_; my @debug_files = glob( $self->get_user_path_( # PROFILE BLOCK START $self->config_( 'logdir' ) . 'popfile*.log', 0 ) ); # PROFILE BLOCK STOP foreach my $debug_file (@debug_files) { # Extract the epoch information from the popfile log file name if ( $debug_file =~ /popfile([0-9]+)\.log/ ) { # If older than now - 3 days then delete unlink($debug_file) if ( $1 < ($self->time - 3 * $seconds_per_day) ); } } } # ---------------------------------------------------------------------------- # # debug # # $level The level of this message # $message A string containing a debug message that may or may not be # printed # # Prints the passed string if the global $debug is true # # ---------------------------------------------------------------------------- sub debug { my ( $self, $level, $message ) = @_; if ( $self->{initialize_called__} == 0 ) { return; } if ( ( !defined( $self->config_( 'level' ) ) ) || # PROFILE BLOCK START ( $level > $self->config_( 'level' ) ) ) { # PROFILE BLOCK STOP return; } if ( $self->{debug_filename__} eq '' ) { return; } if ( $self->global_config_( 'debug' ) > 0 ) { # Check to see if we are handling the USER/PASS command and if # we are then obscure the account information if ( $message =~ /((--)?)(USER|PASS)\s+\S*(\1)/i ) { $message = "$`$1$3 XXXXXX$4"; } $message =~ s/([\x00-\x1f])/sprintf("[%2.2x]", ord($1))/eg; my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = # PROFILE BLOCK START localtime; # PROFILE BLOCK STOP $year += 1900; $mon += 1; $min = "0$min" if ( $min < 10 ); $hour = "0$hour" if ( $hour < 10 ); $sec = "0$sec" if ( $sec < 10 ); my $delim = ' '; $delim = "\t" if ( $self->config_( 'format' ) eq 'tabbed' ); $delim = ',' if ( $self->config_( 'format' ) eq 'csv' ); my $msg = # PROFILE BLOCK START "$year/$mon/$mday$delim$hour:$min:$sec$delim$$:$delim$message\n"; # PROFILE BLOCK STOP if ( $self->global_config_( 'debug' ) & 1 ) { if ( open DEBUG, ">>$self->{debug_filename__}" ) { print DEBUG $msg; close DEBUG; } } print $msg if ( $self->global_config_( 'debug' ) & 2 ); # Add the line to the in memory collection of the last ten # logger entries and then remove the first one if we now have # more than 10 push @{$self->{last_ten__}}, ($msg); if ( $#{$self->{last_ten__}} > 9 ) { shift @{$self->{last_ten__}}; } } } # GETTERS/SETTERS sub debug_filename { my ( $self ) = @_; return $self->{debug_filename__}; } sub last_ten { my ( $self ) = @_; if ( $#{$self->{last_ten__}} >= 0 ) { return @{$self->{last_ten__}}; } else { my @temp = ( 'log empty' ); return @temp; } } 1; popfile-1.1.3+dfsg/POPFile/Module.pm0000664000175000017500000006400311710356074016375 0ustar danieldaniel#---------------------------------------------------------------------------- # # This is POPFile's top level Module object. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- package POPFile::Module; use strict; use IO::Select; # ---------------------------------------------------------------------------- # # This module implements the base class for all POPFile Loadable # Modules and contains collection of methods that are common to all # POPFile modules and only selected ones need be overriden by # subclasses # # POPFile is constructed from a collection of classes which all have # special PUBLIC interface functions: # # initialize() - called after the class is created to set default # values for internal variables and global configuration information # # start() - called once all configuration has been read and POPFile is # ready to start operating # # stop() - called when POPFile is shutting down # # service() - called by the main POPFile process to allow a submodule # to do its own work (this is optional for modules that do not need to # perform any service) # # prefork() - called when a module has requested a fork, but before # the fork happens # # forked() - called when a module has forked the process. This is # called within the child process and should be used to clean up # # postfork() - called in the parent process to tell it that the fork # has occurred. This is like forked but in the parent. # # childexit() - called in a child process when the child is about # to exit. # # reaper() - called when a process has terminated to give a module a # chance to do whatever clean up is needed # # name() - returns a simple name for the module by which other modules # can get access through the %components hash. The name returned here # will be the name used as the key for this module in %components # # deliver() - called by the message queue to deliver a message # # The following methods are PROTECTED and should be accessed by sub classes: # # log_() - sends a string to the logger # # config_() - gets or sets a configuration parameter for this module # # mq_post_() - post a message to the central message queue # # mq_register_() - register for messages from the message queue # # slurp_() - Reads a line up to CR, CRLF or LF # # register_configuration_item_() - register a UI configuration item # # A note on the naming # # A method or variable that ends with an underscore is PROTECTED and # should not be accessed from outside the class (or subclass; in C++ # its protected), to access a PROTECTED variable you will find an # equivalent getter/setter method with no underscore. # # Truly PRIVATE variables are indicated by a double underscore at the # end of the name and should not be accessed outside the class without # going through a getter/setter and may not be directly accessed by a # subclass. # # For example # # $c->foo__() is a private method $c->{foo__} is a private variable # $c->foo_() is a protected method $c->{foo_} is a protected variable # $c->foo() is a public method that modifies $c->{foo_} it always # returns the current value of the variable it is referencing and if # passed a value sets that corresponding variable # # ---------------------------------------------------------------------------- # This variable is CLASS wide, not OBJECT wide and is used as # temporary storage for the slurp_ methods below. It needs to be # class wide because different objects may call slurp on the same # handle as the handle gets passed from object to object. my %slurp_data__; #---------------------------------------------------------------------------- # new # # Class new() function, all real work gets done by initialize and # the things set up here are more for documentation purposes than # anything so that you know that they exists # #---------------------------------------------------------------------------- sub new { my $type = shift; my $self; # A reference to the POPFile::Configuration module, every module is # able to get configuration information through this, note that it # is valid when initialize is called, however, the configuration is not # read from disk until after initialize has been called $self->{configuration__} = 0; # PRIVATE # A reference to the POPFile::Logger module $self->{logger__} = 0; # PRIVATE # A reference to the POPFile::MQ module $self->{mq__} = 0; # The name of this module $self->{name__} = ''; # PRIVATE # Used to tell any loops to terminate $self->{alive_} = 1; # This is a reference to the pipeready() function in popfile.pl # that it used to determine if a pipe is ready for reading in a # cross platform way $self->{pipeready_} = 0; # This is a reference to a function (forker) in popfile.pl that # performs a fork and informs modules that a fork has occurred $self->{forker_} = 0; return bless $self, $type; } # ---------------------------------------------------------------------------- # # initialize # # Called to initialize the module, the main task that this function # should perform is setting up the default values of the configuration # options for this object. This is done through the configuration_ # hash value that will point the configuration module. # # Note that the configuration is not loaded from disk until after # every module's initialize has been called, so do not use any of # these values until start() is called as they may change # # The method should return 1 to indicate that it initialized # correctly, if it returns 0 then POPFile will abort loading # immediately # # ---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; return 1; } # ---------------------------------------------------------------------------- # # start # # Called when all configuration information has been loaded from disk. # # The method should return 1 to indicate that it started correctly, if # it returns 0 then POPFile will abort loading immediately, returns 2 # if everything OK but this module does not want to continue to be # used. # # ---------------------------------------------------------------------------- sub start { my ( $self ) = @_; return 1; } # ---------------------------------------------------------------------------- # # stop # # Called when POPFile is closing down, this is the last method that # will get called before the object is destroyed. There is no return # value from stop(). # # ---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; } # ---------------------------------------------------------------------------- # # reaper # # Called when a child process terminates somewhere in POPFile. The # object should check to see if it was one of its children and do any # necessary processing by calling waitpid() on any child handles it # has # # There is no return value from this method # # ---------------------------------------------------------------------------- sub reaper { my ( $self ) = @_; } # ---------------------------------------------------------------------------- # # service # # service() is a called periodically to give the module a chance to do # housekeeping work. # # If any problem occurs that requires POPFile to shutdown service() # should return 0 and the top level process will gracefully terminate # POPFile including calling all stop() methods. In normal operation # return 1. # # ---------------------------------------------------------------------------- sub service { my ( $self ) = @_; return 1; } # ---------------------------------------------------------------------------- # # prefork # # This is called when some module is about to fork POPFile # # There is no return value from this method # # ---------------------------------------------------------------------------- sub prefork { my ( $self ) = @_; } # ---------------------------------------------------------------------------- # # forked # # This is called when some module forks POPFile and is within the # context of the child process so that this module can close any # duplicated file handles that are not needed. # # $writer The writing end of a pipe that can be used to send up from # the child # # There is no return value from this method # # ---------------------------------------------------------------------------- sub forked { my ( $self, $writer ) = @_; } # ---------------------------------------------------------------------------- # # postfork # # This is called when some module has just forked POPFile. It is # called in the parent process. # # $pid The process ID of the new child process $reader The reading end # of a pipe that can be used to read messages from the child # # There is no return value from this method # # ---------------------------------------------------------------------------- sub postfork { my ( $self, $pid, $reader ) = @_; } # ---------------------------------------------------------------------------- # # childexit # # Called in a child process when the child is about to exit # # There is no return value from this method # # ---------------------------------------------------------------------------- sub childexit { my ( $self ) = @_; } # ---------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # There is no return value from this method # # ---------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; } # ---------------------------------------------------------------------------- # # log_ # # Called by a subclass to send a message to the logger, the logged # message will be prefixed by the name of the module in use # # $level The log level (see POPFile::Logger for details) # $message The message to log # # There is no return value from this method # # ---------------------------------------------------------------------------- sub log_ { my ( $self, $level, $message ) = @_; my ( $package, $file, $line ) = caller; $self->{logger__}->debug( $level, "$self->{name__}: $line: $message" ); } # ---------------------------------------------------------------------------- # # config_ # # Called by a subclass to get or set a configuration parameter # # $name The name of the parameter (e.g. 'port') # $value (optional) The value to set # # If called with just a $name then config_() will return the current value # of the configuration parameter. # # ---------------------------------------------------------------------------- sub config_ { my ( $self, $name, $value ) = @_; return $self->module_config_( $self->{name__}, $name, $value ); } # ---------------------------------------------------------------------------- # # mq_post_ # # Called by a subclass to post a message to the message queue # # $type Type of message to send # @message Message to send # # ---------------------------------------------------------------------------- sub mq_post_ { my ( $self, $type, @message ) = @_; return $self->{mq__}->post( $type, @message ); } # ---------------------------------------------------------------------------- # # mq_register_ # # Called by a subclass to register with the message queue for messages # # $type Type of message to send # $object Callback object # # ---------------------------------------------------------------------------- sub mq_register_ { my ( $self, $type, $object ) = @_; return $self->{mq__}->register( $type, $object ); } # ---------------------------------------------------------------------------- # # global_config_ # # Called by a subclass to get or set a global (i.e. not module # specific) configuration parameter # # $name The name of the parameter (e.g. 'port') # $value (optional) The value to set # # If called with just a $name then global_config_() will return the # current value of the configuration parameter. # # ---------------------------------------------------------------------------- sub global_config_ { my ( $self, $name, $value ) = @_; return $self->module_config_( 'GLOBAL', $name, $value ); } # ---------------------------------------------------------------------------- # # module_config_ # # Called by a subclass to get or set a module specific configuration parameter # # $module The name of the module that owns the parameter (e.g. 'pop3') # $name The name of the parameter (e.g. 'port') $value (optional) The # value to set # # If called with just a $module and $name then module_config_() will # return the current value of the configuration parameter. # # ---------------------------------------------------------------------------- sub module_config_ { my ( $self, $module, $name, $value ) = @_; return $self->{configuration__}->parameter( $module . "_" . $name, $value ); } # ---------------------------------------------------------------------------- # # register_configuration_item_ # # Called by a subclass to register a UI element # # $type, $name, $templ, $object # See register_configuration_item__ in UI::HTML # # ---------------------------------------------------------------------------- sub register_configuration_item_ { my ( $self, $type, $name, $templ, $object ) = @_; return $self->mq_post_( 'UIREG', $type, $name, $templ, $object ); } # ---------------------------------------------------------------------------- # # get_user_path_, get_root_path_ # # Wrappers for POPFile::Configuration get_user_path and get_root_path # # $path The path to modify # $sandbox Set to 1 if this path must be sandboxed (i.e. absolute # paths and paths containing .. are not accepted). # # ---------------------------------------------------------------------------- sub get_user_path_ { my ( $self, $path, $sandbox ) = @_; return $self->{configuration__}->get_user_path( $path, $sandbox ); } sub get_root_path_ { my ( $self, $path, $sandbox ) = @_; return $self->{configuration__}->get_root_path( $path, $sandbox ); } # ---------------------------------------------------------------------------- # # flush_slurp_data__ # # Helper function for slurp_ that returns an empty string if the slurp # buffer doesn't contain a complete line, or returns a complete line. # # $handle Handle to read from, which should be in binmode # # ---------------------------------------------------------------------------- sub flush_slurp_data__ { my ( $self, $handle ) = @_; # The acceptable line endings are CR, CRLF or LF. So we look for # them using these regexps. # Look for LF if ( $slurp_data__{"$handle"}{data} =~ s/^([^\015\012]*\012)// ) { return $1; } # Look for CRLF if ( $slurp_data__{"$handle"}{data} =~ s/^([^\015\012]*\015\012)// ) { return $1; } # Look for CR, here we have to be careful because of the fact that # the current total buffer could be ending with CR and there could # actually be an LF to read, so we check for that situation if we # find CR if ( $slurp_data__{"$handle"}{data} =~ s/^([^\015\012]*\015)// ) { my $cr = $1; # If we have removed everything from the buffer then see if # there's another character available to read, if there is # then get it and check to see if it is LF (in which case this # is a line ending CRLF), otherwise just save it if ( $slurp_data__{"$handle"}{data} eq '' ) { if ( $self->can_read__( $handle )) { my $c; my $retcode = sysread( $handle, $c, 1 ); if ( $retcode == 1 ) { if ( $c eq "\012" ) { $cr .= $c; } else { $slurp_data__{"$handle"}{data} = $c; } } } } return $cr; } return ''; } # ---------------------------------------------------------------------------- # # slurp_data_size__ # # $handle A connection handle previously used with slurp_ # # Returns the length of data currently buffered for the passed in handle # # ---------------------------------------------------------------------------- sub slurp_data_size__ { my ( $self, $handle ) = @_; return defined($slurp_data__{"$handle"}{data})?length($slurp_data__{"$handle"}{data}):0; } # ---------------------------------------------------------------------------- # # slurp_buffer_ # # $handle Handle to read from, which should be in binmode # $length The amount of data to read # # Reads up to $length bytes from $handle and returns it, if there is nothing # to return because the buffer is empty and the handle is at eof then this # will return undef # # ---------------------------------------------------------------------------- sub slurp_buffer_ { my ( $self, $handle, $length ) = @_; while ( $self->slurp_data_size__( $handle ) < $length ) { my $c; if ( $self->can_read__( $handle, 0.01 ) && ( sysread( $handle, $c, $length ) > 0 ) ) { $slurp_data__{"$handle"}{data} .= $c; } else { last; } } my $result = ''; if ( $self->slurp_data_size__( $handle ) < $length ) { $result = $slurp_data__{"$handle"}{data}; $slurp_data__{"$handle"}{data} = ''; } else { $result = substr( $slurp_data__{"$handle"}{data}, 0, $length ); $slurp_data__{"$handle"}{data} = # PROFILE BLOCK START substr( $slurp_data__{"$handle"}{data}, $length ); # PROFILE BLOCK STOP } return ($result ne '')?$result:undef; } # ---------------------------------------------------------------------------- # # slurp_ # # A replacement for Perl's <> operator on a handle that reads a line # until CR, CRLF or LF is encountered. Returns the line if read (with # the CRs and LFs), or undef if at the EOF, blocks waiting for # something to read. # # IMPORTANT NOTE: If you don't read to the end of the stream using # slurp_ then there may be a small memory leak caused by slurp_'s # buffering of data in the Module's hash. To flush it make a call to # slurp_ when you know that the handle is at the end of the stream, or # call done_slurp_ on the handle. # # $handle Handle to read from, which should be in binmode # # ---------------------------------------------------------------------------- sub slurp_ { my ( $self, $handle, $timeout ) = @_; $timeout = $self->global_config_( 'timeout' ) if ( !defined( $timeout ) ); if ( !defined( $slurp_data__{"$handle"}{data} ) ) { $slurp_data__{"$handle"}{select} = new IO::Select( $handle ); $slurp_data__{"$handle"}{data} = ''; } my $result = $self->flush_slurp_data__( $handle ); if ( $result ne '' ) { return $result; } my $c; if ( $self->can_read__( $handle, $timeout ) ) { while ( sysread( $handle, $c, 160 ) > 0 ) { $slurp_data__{"$handle"}{data} .= $c; $self->log_( 2, "Read slurp data $c" ); $result = $self->flush_slurp_data__( $handle ); if ( $result ne '' ) { return $result; } } } else { # Server has not respond. Close the connection and return $self->done_slurp_( $handle ); close $handle; return undef; } # If we get here with something in line then the file ends without any # CRLF so return the line, otherwise we are reading at the end of the # stream/file so return undef my $remaining = $slurp_data__{"$handle"}{data}; $self->done_slurp_( $handle ); if ( $remaining eq '' ) { return undef; } else { return $remaining; } } # ---------------------------------------------------------------------------- # # done_slurp_ # # Call this when have finished calling slurp_ on a handle and need to # clean up temporary buffer space used by slurp_ # # ---------------------------------------------------------------------------- sub done_slurp_ { my ( $self, $handle ) = @_; delete $slurp_data__{"$handle"}{select}; delete $slurp_data__{"$handle"}{data}; delete $slurp_data__{"$handle"}; } # ---------------------------------------------------------------------------- # # flush_extra_ - Read extra data from the mail server and send to # client, this is to handle POP servers that just send data when they # shouldn't. I've seen one that sends debug messages! # # Returns the extra data flushed # # $mail The handle of the real mail server # $client The mail client talking to us # $discard If 1 then the extra output is discarded # # ---------------------------------------------------------------------------- sub flush_extra_ { my ( $self, $mail, $client, $discard ) = @_; $discard = 0 if ( !defined( $discard ) ); # If slurp has any data, we want it if ( $self->slurp_data_size__($mail) ) { print $client $slurp_data__{"$mail"}{data} if ( $discard != 1 ); $slurp_data__{"$mail"}{data} = ''; } # Do we always attempt to read? my $always_read = 0; my $selector; if (($^O eq 'MSWin32') && !($mail =~ /socket/i) ) { # select only works reliably on IO::Sockets in Win32, so we # always read files on MSWin32 (sysread returns 0 for eof) $always_read = 1; # PROFILE PLATFORM START MSWin32 # PROFILE PLATFORM STOP } else { # in all other cases, a selector is used to decide whether to read $selector = new IO::Select( $mail ); $always_read = 0; } my $ready; my $buf = ''; my $full_buf = ''; my $max_length = 8192; my $n; while ( $always_read || defined( $selector->can_read(0.01) ) ) { $n = sysread( $mail, $buf, $max_length, length $buf ); if ( $n > 0 ) { print $client $buf if ( $discard != 1 ); $full_buf .= $buf; } else { if ($n == 0) { last; } } } return $full_buf; } # ---------------------------------------------------------------------------- # # can_read__ - Check whether we can read from the specified handle # # Returns true if we can read from the handle # # $handle A connection handle # $timeout A timeout period (in seconds) # # ---------------------------------------------------------------------------- sub can_read__ { my ( $self, $handle, $timeout ) = @_; $timeout = $self->global_config_( 'timeout' ) if ( !defined($timeout) ); # This unpleasant boolean is to handle the case where we # are slurping a non-socket stream under Win32 my $can_read = ( ( $handle !~ /socket/i ) && ( $^O eq 'MSWin32' ) ); if ( !$can_read ) { if ( $handle =~ /ssl/i ) { # If using SSL, check internal buffer of OpenSSL first. $can_read = ( $handle->pending() > 0 ); } if ( !$can_read ) { if ( defined( $slurp_data__{"$handle"}{select} ) ) { $can_read = defined( $slurp_data__{"$handle"}{select}->can_read( $timeout ) ); } else { my $selector = new IO::Select( $handle ); $can_read = defined( $selector->can_read( $timeout ) ); } } } return $can_read; } # GETTER/SETTER methods. Note that I do not expect documentation of # these unless they are non-trivial since the documentation would be a # waste of space # # The only thing to note is the idiom used, stick to that and there's # no need to document these # # sub foo # { # my ( $self, $value ) = @_; # # if ( defined( $value ) ) { # $self->{foo_} = $value; # } # # return $self->{foo_}; # } # # This method access the foo_ variable for reading or writing, # $c->foo() read foo_ and $c->foo( 'foo' ) writes foo_ sub mq { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{mq__} = $value; } return $self->{mq__}; } sub configuration { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{configuration__} = $value; } return $self->{configuration__}; } sub forker { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{forker_} = $value; } return $self->{forker_}; } sub logger { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{logger__} = $value; } return $self->{logger__}; } sub setchildexit { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{childexit_} = $value; } return $self->{childexit_}; } sub pipeready { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{pipeready_} = $value; } return $self->{pipeready_}; } sub alive { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{alive_} = $value; } return $self->{alive_}; } sub name { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{name__} = $value; } return $self->{name__}; } sub version { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{version_} = $value; } return $self->{version_}; } sub last_ten_log_entries { my ( $self ) = @_; return $self->{logger__}->last_ten(); } 1; popfile-1.1.3+dfsg/POPFile/MQ.pm0000664000175000017500000002715711710356074015476 0ustar danieldaniel# POPFILE LOADABLE MODULE package POPFile::MQ; use POPFile::Module; @ISA = ( "POPFile::Module" ); #---------------------------------------------------------------------------- # # This module handles POPFile's message queue. Every POPFile::Module is # able to register with the MQ for specific message types and can also # send messages without having to know which modules need to receive # its messages. # # Message delivery is asynchronous and guaranteed, as well as guaranteed # first in, first out (FIFO) per process. # # The following public functions are defined: # # register() - register for a specific message type and pass an object # reference. will call that object's deliver() method to # deliver messages # # post() - send a message of a specific type # # The current list of types is # # UIREG Register a UI component, message is the component type # and the element and reference to the # object registering (comes from any component) # # TICKD Occurs when an hour has passed since the last TICKD (this # is generated by the POPFile::Logger module) # # LOGIN Occurs when a proxy logs into a remote server, the message # is the username sent # # COMIT Sent when an item is committed to the history through a call # to POPFile::History::commit_slot # # RELSE Sent when a session key is being released by a client # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use strict; use warnings; use locale; use POSIX ":sys_wait_h"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); # These are the individual queues of message, indexed by type # and written to by post(). $self->{queue__} = {}; # These are the registered objects for each type $self->{waiters__} = {}; # List of file handles to read from active children, this # maps the PID for each child to its associated pipe handle $self->{children__} = {}; # Record the parent process ID so that we can tell when post is # called whether we are in a child process or not $self->{pid__} = $$; bless $self, $type; $self->name( 'mq' ); return $self; } #---------------------------------------------------------------------------- # # service # # Called to handle pending tasks for the module. Here we flush all queues # #---------------------------------------------------------------------------- sub service { my ( $self ) = @_; # See if any of the children have passed up messages through their # pipes and deal with it now for my $kid (keys %{$self->{children__}}) { $self->flush_child_data_( $self->{children__}{$kid} ); } # Iterate through all the messages in all the queues for my $type (sort keys %{$self->{queue__}}) { while ( my $ref = shift @{$self->{queue__}{$type}} ) { my @message = @$ref; my $flat = join(':', @message); $self->log_( 2, "Message $type ($flat) ready for delivery" ); for my $waiter (@{$self->{waiters__}{$type}}) { $self->log_( 2, "Delivering message $type ($flat) to " . # PROFILE BLOCK START $waiter->name() ); # PROFILE BLOCK STOP $waiter->deliver( $type, @message ); } } } return 1; } #---------------------------------------------------------------------------- # # stop # # Called when POPFile is closing down, this is the last method that # will get called before the object is destroyed. There is not return # value from stop(). # #---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; # Call service() so that any remaining items are flushed and delivered $self->service(); for my $kid (keys %{$self->{children__}}) { close $self->{children__}{$kid}; delete $self->{children__}{$kid}; } } #---------------------------------------------------------------------------- # # yield_ # # Called by a child process to allow the parent to do work, this only # does anything in the case where we didn't fork for the child process # #---------------------------------------------------------------------------- sub yield_ { my ( $self, $pipe, $pid ) = @_; if ( $pid != 0 ) { $self->flush_child_data_( $pipe ) } } #---------------------------------------------------------------------------- # # forked # # This is called when some module forks POPFile and is within the # context of the child process so that this module can close any # duplicated file handles that are not needed. # # $writer The writing end of a pipe that can be used to send up from # the child # # There is no return value from this method # #---------------------------------------------------------------------------- sub forked { my ( $self, $writer ) = @_; $self->{writer__} = $writer; for my $kid (keys %{$self->{children__}}) { close $self->{children__}{$kid}; delete $self->{children__}{$kid}; } } #---------------------------------------------------------------------------- # # postfork # # This is called when some module has just forked POPFile. It is # called in the parent process. # # $pid The process ID of the new child process # $reader The reading end of a pipe that can be used to read messages # from the child # # There is no return value from this method # #---------------------------------------------------------------------------- sub postfork { my ( $self, $pid, $reader ) = @_; $self->{children__}{"$pid"} = $reader; $self->log_( 2, "Parent: postfork() called for pid $pid, reader $reader" ); } #---------------------------------------------------------------------------- # # reaper # # Called when a child process terminates somewhere in POPFile. The # object should check to see if it was one of its children and do any # necessary processing by calling waitpid() on any child handles it # has # # There is no return value from this method # #---------------------------------------------------------------------------- sub reaper { my ( $self ) = @_; # Look for children that have completed and then flush the data # from their associated pipe and see if any of our children have # data ready to read from their pipes, my @kids = keys %{$self->{children__}}; if ( $#kids >= 0 ) { for my $kid (@kids) { if ( waitpid( $kid, &WNOHANG ) == $kid ) { $self->flush_child_data_( $self->{children__}{$kid} ); close $self->{children__}{$kid}; delete $self->{children__}{$kid}; $self->log_( 0, "Done with $kid (" . scalar(keys %{$self->{children__}}) . " to go)" ); } } } } #---------------------------------------------------------------------------- # # read_pipe_ # # reads a single message from a pipe in a cross-platform way. # returns undef if the pipe has no message # # $handle The handle of the pipe to read # #---------------------------------------------------------------------------- sub read_pipe_ { my ( $self, $handle ) = @_; if ( $^O eq "MSWin32" ) { # bypasses bug in -s $pipe under ActivePerl my $message; # PROFILE PLATFORM START MSWin32 if ( &{ $self->{pipeready_} }($handle) ) { # add data to the pipe cache whenever the pipe is ready sysread($handle, my $string, -s $handle); # push messages onto the end of our cache $self->{pipe_cache__} .= $string; } # pop the oldest message; $message = $1 if (defined($self->{pipe_cache__}) && # PROFILE BLOCK START ( $self->{pipe_cache__} =~ s/(.*?\n)// ) ); # PROFILE BLOCK STOP return $message; # PROFILE PLATFORM STOP } else { # do things normally if ( &{ $self->{pipeready_} }($handle) ) { return <$handle>; } } return undef; } #---------------------------------------------------------------------------- # # flush_child_data_ # # Called to flush data from the pipe of each child as we go, I did # this because there appears to be a problem on Windows where the pipe # gets a lot of read data in it and then causes the child not to be # terminated even though we are done. Also this is nice because we # deal with the messages on the fly # # $handle The handle of the child's pipe # #---------------------------------------------------------------------------- sub flush_child_data_ { my ( $self, $handle ) = @_; my $stats_changed = 0; my $message; while ( defined ( $message = $self->read_pipe_( $handle ) ) ) { if ( $message =~ /([^:]+):([^\r\n]*)/ ) { my @parameters = split( ':', $2 || '' ); $self->post( $1, @parameters ); } else { $self->log_( 2, "Recieved invalid message from child: $message" ); } } } #---------------------------------------------------------------------------- # # register # # When a module wants to receive specific message types it calls this # method with the type of message is wants to receive and the address # of a callback function that will receive the messages # # $type A string identifying the message type # $callback Reference to a function that takes three parameters # #---------------------------------------------------------------------------- sub register { my ( $self, $type, $callback ) = @_; push @{$self->{waiters__}{$type}}, ( $callback ); } #---------------------------------------------------------------------------- # # post # # Called to send a message through the message queue # # $type A string identifying the message type # @message The message (list of parameters) # #---------------------------------------------------------------------------- sub post { my ( $self, $type, @message ) = @_; my $flat = join( ':', @message ); $self->log_( 2, "post $type ($flat)" ); # If we are in the parent process then just stick this on the queue, # otherwise write it up the pipe. if ( $$ == $self->{pid__} ) { if ( exists( $self->{waiters__}{$type} ) ) { $self->log_( 2, "queuing post $type ($flat)" ); push @{$self->{queue__}{$type}}, \@message; $self->log_( 2, "$type queue length now " . $#{$self->{queue__}{$type}} ); } else { $self->log_( 2, "dropping post $type ($flat)" ); } } else { my $pipe = $self->{writer__}; $self->log_( 2, "sending post $type ($flat) to parent $pipe" ); print $pipe "$type:$flat\n"; } } 1; popfile-1.1.3+dfsg/POPFile/Mutex.pm0000664000175000017500000000564211710356074016256 0ustar danieldanielpackage POPFile::Mutex; #---------------------------------------------------------------------------- # # This is a mutex object that uses mkdir() to provide exclusive access # to a region on a per thread or per process basis. # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #---------------------------------------------------------------------------- use strict; #---------------------------------------------------------------------------- # new # # Create a new Mutex object (which may refer to a file referred to by # other mutexes) with a specific name generated from the name passed # in. # #---------------------------------------------------------------------------- sub new { my ( $type, $name ) = @_; my $self; $self->{name__} = "popfile_mutex_${name}.mtx"; release( $self ); return bless $self, $type; } #---------------------------------------------------------------------------- # # acquire # # Returns 1 if it manages to grab the mutex (and will block if necessary) # and 0 if it fails. # # $self Reference to this object # $timeout Timeout in seconds to wait (undef = infinite) # #---------------------------------------------------------------------------- sub acquire { my ( $self, $timeout ) = @_; # If acquire() has been called without a matching release() then # fail at once if ( defined( $self->{locked__} ) ) { return 0; } # Wait a very long time if no timeout is specified $timeout = 0xFFFFFFFF if ( !defined( $timeout ) ); my $now = time; # Try to create a directory during the timeout period do { if ( mkdir( $self->{name__}, 0755 ) ) { # Create a directory $self->{locked__} = 1; return 1; } select( undef, undef, undef, 0.01 ); } while ( time < ( $now + $timeout ) ); # Timed out so return 0 return 0; } #---------------------------------------------------------------------------- # # release # # Release the lock if we acquired it with a call to acquire() # #---------------------------------------------------------------------------- sub release { my ( $self ) = @_; rmdir( $self->{name__} ); # Delete the Mutex directory $self->{locked__} = undef; } 1; popfile-1.1.3+dfsg/POPFile/popfile_version0000664000175000017500000000001411630124200017711 0ustar danieldaniel1 1 3 popfile-1.1.3+dfsg/popfile.pck0000664000175000017500000000204711631412440015501 0ustar danieldanielOPTIONAL-Upgrades from v0.20.x 0.0.0 BerkeleyDB REQUIRED 0.0.0 Carp REQUIRED 0.0.0 Cwd OPTIONAL-SQLite3 backend 0.0.0 DBD::SQLite REQUIRED 0.0.0 DBI REQUIRED 0.0.0 Date::Format REQUIRED 0.0.0 Date::Parse REQUIRED 0.0.0 Digest::MD5 OPTIONAL-Japanese Language Support 0.0.0 Encode OPTIONAL-Japanese Language Support 0.0.0 Encode::Guess REQUIRED 0.0.0 Fcntl REQUIRED 0.0.0 File::Copy OPTIONAL-Japanese Language Support (Windows only) 0.0.0 File::Glob::Windows REQUIRED 0.0.0 Getopt::Long REQUIRED 0.0.0 HTML::Tagset REQUIRED 0.0.0 HTML::Template REQUIRED 0.0.0 IO::Handle REQUIRED 0.0.0 IO::Select REQUIRED 0.0.0 IO::Socket REQUIRED 0.0.0 IO::Socket::INET OPTIONAL-SSL Connection Support 0.0.0 IO::Socket::SSL OPTIONAL-Socks Proxy Support 0.0.0 IO::Socket::Socks REQUIRED 0.0.0 MIME::Base64 REQUIRED 0.0.0 MIME::QuotedPrint OPTIONAL-Japanese Language Support 0.0.0 MeCab REQUIRED 0.0.0 POSIX REQUIRED 0.0.0 Sys::Hostname OPTIONAL-Japanese Language Support 0.0.0 Text::Kakasi OPTIONAL-XML-RPC Server Support 0.0.0 XMLRPC::Transport::HTTP popfile-1.1.3+dfsg/pix.gif0000664000175000017500000000005311624177332014640 0ustar danieldanielGIF89aタタタf!,D;popfile-1.1.3+dfsg/otto.png0000664000175000017500000000077511624177332015057 0ustar danieldaniel臼NG  IHDRXTメtIMEヤ7*s|h pHYs  メン~gAMAア aPLTEュ゙釀stRNS@齎fdIDATxレスヨ猿テ Pソyチ\c示"鷸ン(。ル2ェネソUネナ Zォ欖鳶哇イツェ螟7ユh{rYワセータX=シu6Wオ ゙'|Sサg|ューャーNOロ$棲9ヨ#ヨヨ> 箘テ~メ:Xキ> 笹テ末」フキ&ホCCョW嫻軛リMク58ツスヌc 巡iYァaワチハQ、7)〒[ms0游&エMキ"モ矍e<ヌt=ew揃歪*ケ*ヒ3'%йij:dWtマモ0Hウ「f ニワン ウ ,用v[6モ「 狢q孤藹Kワrlフ =イ)モ筱ヒi緋ヲJ カコ▼'ミ3l52;ク 隔イォ曜鳬。放日 拙リャIENDョB`popfile-1.1.3+dfsg/otto.gif0000664000175000017500000000232011624177332015024 0ustar danieldanielGIF89aXollキ%貘テWフsサ7珀゚ワ・ホモ櫛盖ワオウウ||リ侈ネヌネfRPOソHミ! `]]FDC-,,酔蟒牴ム鯢饒YJ゚ャ箏ブォチPコ4メ廻ナ]ミトZ゚マョ獗コラ赭ツ机ユ畳ネkヘz羚ナbヤユラカム貔ヨフv「沺ロ977ウ!,XCcу炎旧轟 似劔A棔A >・>ィヲ・ーア、 Cカ嚆ス機BテテョツテニC>トテCホテCツ@ヨBリコ攷チヤBム罟ヘヤメ聘リラワ゚ス瘧ネホトテフニi`Gmネニ倏姆SqB"ラー 8/4!>薐h!& 0B9垂2 {5 @6湘BぉP豕K z"ーイレG,},U謄Qj6yj3HmY#。A,At#)Aヲヤー}$u*<|\Rム槍甃vsミメtホl鹿魄ッソ >&qp於p(bXQbハnF,1 ム事B%ロク1ぢ。!+5Aェ・|KiNB插\ツ{ロ リ#T槭ヌゥa゙pアe。・クヘN] ーAォA@X@=&0@@k!ッ:誦NN鰄;x p/ *"w。キ Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. 2. BerkeleyDB License Copyright (c) 1997-2003 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Although BerkeleyDB is covered by the Perl license, the library it makes use of, namely Berkeley DB, is not. Berkeley DB has its own copyright and its own license. Please take the time to read it. Here are few words taken from the Berkeley DB FAQ (at http://www.sleepycat.com) regarding the license: Do I have to license DB to use it in Perl scripts? No. The Berkeley DB license requires that software that uses Berkeley DB be freely redistributable. In the case of Perl, that software is Perl, and not your scripts. Any Perl scripts that you write are your property, including scripts that make use of Berkeley DB. Neither the Perl license nor the Berkeley DB license place any restriction on what you may do with them. If you are in any doubt about the license situation, contact either the Berkeley DB authors or the author of BerkeleyDB. See AUTHOR for details. popfile-1.1.3+dfsg/languages/0000775000175000017500000000000011710356074015317 5ustar danieldanielpopfile-1.1.3+dfsg/languages/Ukrainian.msg0000664000175000017500000005316511624177330017762 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Translation by Myroslav Opyr # ナメナヒフチト レトヲハモホタラチラモム レヌヲトホマ ヤナメヘヲホマフマヌヲァ, ンマ マミメチテリマラユ、ヤリモム # ヲホヲテヲチヤノラホマ ヌメユミマタ ミナメナヒフチトヂヲラ レ http://linux.org.ua/ # ナハ ミナメナヒフチト ラノヒマホチラ ノメマモフチラ ミノメ . # チユラチヨナホホム ヤチ ミマツチヨチホホム ミメマロユ ミマトチラチヤノ ホチ ヘマタ チトメナモユ, チツマ # ヤユヤ: http://zope.net.ua/POPFile # Identify the language and character set used for the interface LanguageCode uk LanguageCharset koi8-u LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply チモヤマモユラチヤノ On ラヲヘヒ. Off ノヘヒ. TurnOn ラヲヘヒホユヤノ TurnOff ノヘヒホユヤノ Add 蔆トチヤノ Remove ノフユ゙ノヤノ Previous マミナメナトホヲ Next チモヤユミホヲ From ヲト Subject ナヘチ Cc マミヲム Classification フチモノニヲヒチテヲム Reclassify ヘヲホノヤノ Probability カヘマラヲメホヲモヤリ Scores 簔フノ QuickMagnets ラノトヒヲ ヘチヌホヲヤノ Undo マラナメホユヤノ Close チヒメノヤノ Find ホチハヤノ Filter ヲトニヲフリヤメユラチヤノ Yes チヒ No ヲ ChangeToYes ヘヲホノヤノ ホチ "チヒ" ChangeToNo ヘヲホノヤノ ホチ "ヲ" Bucket チヤナヌマメヲム Magnet チヌホヲヤ Delete ホノンノヤノ Create ヤラマメノヤノ To 蔆 Total チヌチフマヘ Rename ナメナハヘナホユラチヤノ Frequency チモヤマヤチ Probability カヘマラヲメホヲモヤリ Score 簔フノ Lookup ヲトヌフムホユヤノ Word フマラマ Count ヲフリヒヲモヤリ Update ノミメチラノヤノ Refresh マホマラノヤノ # The header and footer that appear on every UI page Header_Title 翡ホヤメ ユミメチラフヲホホム POPFile Header_Shutdown チヌフユロノヤノ POPFile Header_History カモヤマメヲム Header_Buckets チヤナヌマメヲァ Header_Configuration チモヤメマハヒチ Header_Advanced 蔆トチヤヒマラマ Header_Security 簀レミナヒチ Header_Magnets チヌホヲヤノ Footer_HomePage 蔆ヘチロホム モヤマメヲホヒチ POPFile Footer_Manual 蔆ヒユヘナホヤチテヲム Footer_Forums 賺メユヘノ Footer_FeedMe チヌマトユハヤナ ヘナホナ! Footer_RequestFeature エ ヲトナム? チヘマラフムハヤナ Footer_MailingList ミノモマヒ メマレモノフヒノ Configuration_Error1 ノヘラマフ メマレトヲフリホノヒ ミマラノホナホ ツユヤノ マトノホ Configuration_Error2 マメヤ ヲホヤナメニナハモユ ヒマメノモヤユラヂチ ミマラノホナホ ツユヤノ ゙ノモフマヘ ラヲト 1 トマ 65535 Configuration_Error3 マメヤ POP3 ミマラノホナホ ツユヤノ ゙ノモフマヘ ラヲト 1 トマ 65535 Configuration_Error4 マレヘヲメ モヤマメヲホヒノ ミマラノホナホ ツユヤノ ゙ノモフマヘ ラヲト 1 トマ 1000 Configuration_Error5 ヲフリヒヲモヤリ トホヲラ ラ ヲモヤマメヲァ ミマラノホホチ ツユヤノ ゙ノモフマヘ ラヲト 1 トマ 366 Configuration_Error6 ツヘナヨナホホム ミマ レチヤメノヘテヲ TCP ミマラノホホマ ツユヤノ ゙ノモフマヘ ラヲト 10 トマ 1800 Configuration_Error7 マメヤ XML-RPC ミマラノホナホ ツユヤノ ゙ノモフマヘ ラヲト 1 トマ 65535 Configuration_POP3Port マメヤ POP3 Configuration_POP3Update ヘヲホナホマ POP3 ミマメヤ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Configuration_XMLRPCUpdate ヘヲホナホマ XML-RPC ミマメヤ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Configuration_XMLRPCPort マメヤ XML-RPC Configuration_SMTPPort マメヤ SMTP Configuration_SMTPUpdate ヘヲホナホマ SMTP ミマメヤ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Configuration_NNTPPort マメヤ NNTP Configuration_NNTPUpdate ヘヲホナホマ NNTP ミマメヤ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Configuration_POP3Separator ノヘラマフ メマレトヲフリホノヒ POP3 (ヌマモヤ:ミマメヤ:ヒマメノモヤユラヂ) Configuration_NNTPSeparator ノヘラマフ メマレトヲフリホノヒ NNTP (ヌマモヤ:ミマメヤ:ヒマメノモヤユラヂ) Configuration_POP3SepUpdate ヘヲホナホマ メマレトヲフリホノヒ POP3 ホチ %s Configuration_NNTPSepUpdate ヘヲホナホマ メマレトヲフリホノヒ NNTP ホチ %s Configuration_UI ナツ ミマメヤ ヲホヤナメニナハモユ ヒマメノモヤユラヂチ Configuration_UIUpdate ヘヲホナホマ ラナツ ミマメヤ ヲホヤナメニナハモユ ヒマメノモヤユラヂチ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Configuration_History ヲフリヒヲモヤリ フノモヤヲラ ホチ モヤマメヲホテヲ Configuration_HistoryUpdate ヘヲホナホマ ヒヲフリヒヲモヤリ フノモヤヲラ ホチ モヤマメヲホテヲ ホチ %s Configuration_Days カモヤマメヲタ レツナメヲヌチヤノ ホチ ミメマヤムレヲ モヤヲフリヒマネ トホヲラ Configuration_DaysUpdate ヘヲホナホマ ヒヲフリヒヲモヤリ トホヲラ ホチ %s, ホチ ミメマヤムレヲ ムヒノネ レツナメヲヌチ、ヤリモム ヲモヤマメヲム Configuration_UserInterface カホヤナメニナハモ ヒマメノモヤユラヂチ Configuration_Skins ノヌフムト Configuration_SkinsChoose ノツナメヲヤリ ラノヌフムト Configuration_Language マラチ Configuration_LanguageChoose ノツナメヲヤリ ヘマラユ Configuration_ListenPorts フユネチヤノ ホチ ミマメヤチネ Configuration_HistoryView ノヌフムト ヲモヤマメヲァ Configuration_TCPTimeout ツヘナヨナホホム ミマ レチヤメノヘテヲ TCP Configuration_TCPTimeoutSecs ツヘナヨナホホム ミマ レチヤメノヘテヲ TCP ラ モナヒユホトチネ Configuration_TCPTimeoutUpdate ホマラフナホマ TCP レチヤメノヘヒユ トマ %s Configuration_ClassificationInsertion モヤチラフムホホム ヒフチモノニヲヒチテヲァ Configuration_SubjectLine マトノニヲヒチテヲム ヤナヘノ Configuration_XTCInsertion モヤチラフムヤノ X-Text-Classification Configuration_XPLInsertion モヤチラフムヤノ X-POPFile-Link Configuration_Logging ラヲヤユラチホホム Configuration_None ホナヘチ Configuration_ToScreen ホチ ナヒメチホ Configuration_ToFile ラ ニチハフ Configuration_ToScreenFile ホチ ナヒメチホ ヲ ラ ニチハフ Configuration_LoggerOutput ノラヲト レラヲヤユ Configuration_GeneralSkins ラノ゙チハホヲ Configuration_SmallSkins チフヲ Configuration_TinySkins ナホトヲヤホヲ Configuration_CurrentLogFile «ミマヤマ゙ホノハ ミメマヤマヒマフ» Advanced_Error1 '%s' ユヨナ ラ モミノモヒユ モフヲラ Advanced_Error2 フマラチ, ンマ ヲヌホマメユタヤリモム ヘマヨユヤリ ヤヲフリヒノ ヘヲモヤノヤノ ツユヒラノ, テノニメノ, モノヘラマフノ ., _, -, ゙ノ @ Advanced_Error3 '%s' トマトチホマ トマ モミノモヒユ Advanced_Error4 '%s' ホナヘチ、 ラ モミノモヒユ Advanced_Error5 '%s' ラノフユ゙ナホマ レヲ モミノモヒユ Advanced_StopWords ミノモマヒ モフヲラ, ンマ ヲヌホマメユタヤリモム Advanced_Message1 罔 モフマラチ ヲヌホマメユタヤリモム ユ ラモヲネ ヒフチモノニヲヒチテヲムネ, ヤチヒ ムヒ レユモヤメヺチタヤリモム トユヨナ ゙チモヤマ. Advanced_AddWord 蔆トチヤノ モフマラマ Advanced_RemoveWord ノフユ゙ノヤノ モフマラマ History_Filter  (ヤヲフリヒノ ミマヒチレユダノ ヒチヤナヌマメヲタ %s) History_FilterBy 讎フリヤメ ミマ History_Search  (ミマロユヒチラロノ レチ ヤナヘマタ %s) History_Title モヤチホホヲ ミマラヲトマヘフナホホム History_Jump ナメナハヤノ トマ ミマラヲトマヘフナホホム History_ShowAll マヒチレチヤノ ユモヲ History_ShouldBe チ、 ツユヤノ History_NoFrom ホナヘチ、 メムトヒチ ヲト History_NoSubject ホナヘチ メムトヒチ ナヘノ History_ClassifyAs メマヒフチモノニヲヒユハ ムヒ History_MagnetUsed ノヒマメノモヤチホマ ヘチヌホヲヤ History_MagnetBecause ノヒマメノモヤチホマ チヌホヲヤ

メマヒフチモノニヲヒマラチホマ ムヒ %s ツマ レチトヲムホマ ヘチヌホヲヤ %s

History_ChangedTo ヘヲホナホマ ホチ %s History_Already ヨナ レヘヲホナホマ ホチ %s History_RemoveAll ノフユ゙ノヤノ ラモヲ History_RemovePage ノフユ゙ノヤノ モヤマメヲホヒユ History_Remove マツ ラノフユ゙ノヤノ ナフナヘナホヤノ レ ヲモヤマメヲァ ヒフチテホヲヤリ History_SearchMessage マロユヒ ミマ ヲト/ナヘチ History_NoMessages ナヘチ、 ミマラヲトマヘフナホリ History_ShowMagnet チヘチヌホヺナホヲ History_ShowNoMagnet ナホチヘチヌホヺナホヲ History_Magnet  (ヤヲフリヒノ ミマラヲトマヘフナホホム ミメノヤムヌホユヤヲ ヘチヌホヲヤチヘノ) History_NoMagnet  (ヤヲフリヒノ ミマラヲトマヘフナホホム ホナミメノヤムヌホユヤヲ ヘチヌホヲヤチヘノ) History_ResetSearch ヒノホユヤノ Password_Title チメマフリ Password_Enter ラナトヲヤリ ミチメマフリ Password_Go ミナメナト! Password_Error1 ナミメチラノフリホノハ ミチメマフリ Security_Error1 簀レミナ゙ホノハ ミマメヤ ミマラノホナホ ツユヤノ ゙ノモフマヘ ヘヲヨ 1 ヤチ 65535 Security_Stealth ナラノトノヘノハ メナヨノヘ/メマツマヤチ モナメラナメチ Security_NoStealthMode ヲ (ナラノトノヘノハ メナヨノヘ) Security_ExplainStats (ヒンマ テナ ララヲヘヒホユヤマ, ヤマ POPFile ホチトモノフチ、 メチレ ラ トナホリ ホチモヤユミホヲ ヤメノ レホヂナホホヲ モヒメノミヤユ ホチ getpopfile.org: bc (レチヌチフリホチ ヒヲフリヒヲモヤリ ヒチヤナヌマメヲハ, ムヒユ ヘチ、ヤナ), mc (レチヌチフリホユ ヒヲフリヒヲモヤリ ミマラヲトマヘフナホリ ンマ ミメマヒフチモノニヲヒユラチラ POPFile) ヤチ ec (レチヌチフリホチ ヒヲフリヒヲモヤリ ミマヘノフマヒ ヒフチモノニヲヒチテヲァ). マホノ レツナメヲヌチタヤリモム ラ ニチハフヲ ヲ ム ラノヒマメノモヤマラユタ ァネ ンマツ マミユツフヲヒユラチヤノ トナムヒユ モヤチヤノモヤノヒユ ミメマ ヤナ, ムヒ フタトノ ラノヒマメノモヤマラユタヤリ POPFile ヲ ホチモヒヲフリヒノ トマツメナ ラヲホ トフム ホノネ ミメチテタ、. ヲハ ラナツ モナメラナメ レツナメヲヌチ、 モラマァ ニチハフノ レラヲヤヲラ ヒマフマ 5 トホヲラ ヲ ヤマトヲ ァネ モヤノメチ、ヤリモム; ム ホナ レツナメヲヌチタ ツユトリ ムヒマヌマ レラ'ムレヒユ ヘヲヨ モヤチヤノモヤノヒマタ ヤチ ヲホトノラヲトユチフリホノヘノ IP チトメナモチヘノ.) Security_ExplainUpdate (ヒンマ テナ ララヲヘヒホユヤマ, ヤマ POPFile ホチトモノフチ、 メチレ ラ トナホリ ホチモヤユミホヲ ヤメノ レホヂナホホヲ モヒメノミヤユ ホチ getpopfile.org: ma (マモホマラホチ ラナメモヲム ラチロマヌマ ラモヤチホマラフナホマヌマ POPFile), mi (ラヤマメノホホチ ラナメモヲム ラチロマヌマ ラモヤチホマラフナホマヌマ POPFile) ヤチ bn (ホマヘナメ ミマツユトマラノ ラチロマヌマ ラモヤチホマラフナホマヌマ POPFile). POPFile マヤメノヘユ、 ラヲトミマラヲトリ ユ ニマメヘヲ ヌメチニヲヒノ ンマ レ'ムラフム、ヤリモム レヌマメノ モヤマメヲホヒノ ムヒンマ ホチムラホチ ホマラチ ラナメモヲム. ヲハ ラナツ モナメラナメ レツナメヲヌチ、 モラマァ ニチハフノ レラヲヤヲラ ヒマフマ 5 トホヲラ ヲ ヤマトヲ ァネ モヤノメチ、ヤリモム; ム ホナ レツナメヲヌチタ ツユトリ ムヒマヌマ レラ'ムレヒユ ヘヲヨ ミナメナラヲメヒマタ マホマラフナホリ ヤチ ヲホトノラヲトユチフリホノヘノ IP チトメナモチヘノ.) Security_PasswordTitle チメマフリ ヲホヤナメニナハモユ ヒマメノモヤユラヂチ Security_Password チメマフリ Security_PasswordUpdate チメマフリ レヘヲホナホマ トフム %s Security_AUTHTitle 簀レミナ゙ホチ チラヤナホヤノニヲヒチテヲム ミチメマフナヘ/AUTH Security_SecureServer 簀レミナ゙ホノハ モナメラナメ Security_SecureServerUpdate ヘヲホナホマ ツナレミナ゙ホノハ モナメラナメ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Security_SecurePort 簀レミナ゙ホノハ ミマメヤ Security_SecurePortUpdate ヘヲホナホマ ミマメヤ ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile Security_SMTPServer チホテタヌマラノハ モナメラナメ SMTP
(myroslav@zope.net.ua: ミナメナラヲメノヤノ ミナメナヒフチト) Security_SMTPServerUpdate ヘヲホナホマ フチホテタヌマラノハ モナメラナメ SMTP ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile
(myroslav@zope.net.ua: ミナメナラヲメノヤノ ミナメナヒフチト) Security_SMTPPort チホテタヌマラノハ ミマメヤ SMTP
(myroslav@zope.net.ua: ミナメナラヲメノヤノ ミナメナヒフチト) Security_SMTPPortUpdate ヘヲホナホマ フチホテタヌマラノハ ミマメヤ SMTP ホチ %s; テム レヘヲホチ ホナ ツユトナ トヲハモホマタ ミマヒノ ラノ ホナ メナモヤチメヤユ、ヤナ POPFile
(myroslav@zope.net.ua: ミナメナラヲメノヤノ ミナメナヒフチト) Security_POP3 メノハヘチヤノ POP3 ミヲト'、トホチホホム レ ラヲトトチフナホノネ ヘチロノホ (ラノヘチヌチ、 メナモヤチメヤユ POPFile) Security_SMTP メノハヘチヤノ SMTP ミヲト'、トホチホホム レ ラヲトトチフナホノネ ヘチロノホ (ラノヘチヌチ、 メナモヤチメヤユ POPFile) Security_NNTP メノハヘチヤノ NNTP ミヲト'、トホチホホム レ ラヲトトチフナホノネ ヘチロノホ (ラノヘチヌチ、 メナモヤチメヤユ POPFile) Security_UI メノハヘチヤノ HTTP (ヲホヤナメニナハモ ヒマメノモヤユラヂチ) ミヲト'、トホチホホム ラヲト ラヲトトチフナホノネ ヘチロノホ Security_XMLRPC メノハヘチヤノ XML-RPC ミヲト'、トホチホホム レ ラヲトトチフナホノネ ヘチロノホ (ラノヘチヌチ、 メナモヤチメヤユ POPFile) Security_UpdateTitle 瞹ヤマヘチヤノ゙ホチ ミナメナラヲメヒチ マホマラフナホリ Security_Update マトナホホマ ミナメナラヲメムヤノ レチ マホマラフナホホムヘノ POPFile Security_StatsTitle ラヲヤユラチホホム モヤチヤノモヤノヒノ Security_Stats ヲトモノフチヤノ ンマトナホホマ モヤチヤノモヤノヒユ ホチレチト トマ 葷マホチ Magnet_Error1 チヌホヲヤ '%s' ユヨナ ヲモホユ、 ラ ヒチヤナヌマメヲァ '%s' Magnet_Error2 マラノハ ヘチヌホヲヤ '%s' ヒマホニフヲヒヤユ、 レ ヘチヌホヲヤマヘ '%s' ラ ヒチヤナヌマメヲァ '%s' ヲ ヘマヨナ モミメノ゙ノホノヤノ ホナマトホマレホヂホヲ メナレユフリヤチヤノ. マラマヌマ ヘチヌホヲヤユ トマトチホマ. Magnet_Error3 ヤラマメナホマ ホマラノハ ヘチヌホヲヤ '%s' ラ ヒチヤナヌマメヲァ '%s' Magnet_CurrentMagnets チムラホヲ ヘチヌホヲヤノ Magnet_Message1 チモヤユミホヲ ヘチヌホヲヤノ レチモヤチラフムタヤリ ミマロヤユ レチラヨトノ ツユヤノ ヒフチモノニヲヒマラチホマタ ユ ラヒチレチホユ ヒチヤナヌマメヲタ. Magnet_CreateNew ヤラマメノヤノ ホマラノハ ヘチヌホヲヤ Magnet_Explanation マヨフノラヲ ヤメノ ラノトノ ヘチヌホヲヤヲラ:
  • 眛メナモチ チツマ ヲヘ'ム ヲト: チミメノヒフチト: john@company.com ンマツ ミメノヤムヌホユヤノ ミナラホユ チトメナモユ,
    company.com ンマツ ミメノヤムヌホユヤノ ユモヲネ, ネヤマ ミマモノフチ、 レ company.com,
    John Doe ンマツ ミメノヤムヌホユヤノ ミナラホユ マモマツユ, John ンマツ ミメノヤムヌホユヤノ ユモヲネ 葷マホヲラ
  • 眛メナモチ チツマ ヲヘ'ム 蔆: マトヲツホマ トマ ヘチヌホヲヤユ ヲト: チフナ ンマトマ チトメナモノ 蔆: フノモヤチ
  • フマラチ レ ナヘノ: チミメノヒフチト: hello ンマツ ミメノヤムヌホユヤノ ユモヲ モフマラチ レ hello ラ ヤナヘヲ
Magnet_MagnetType ノミ ヘチヌホヲヤユ Magnet_Value ホヂナホホム Magnet_Always チラヨトノ ミヲトナ ラ ヒチヤナヌマメヲタ Magnet_Jump ナメナモヒマ゙ノヤノ ホチ モヤマメヲホヒユ ヘチヌホヲヤヲラ Bucket_Error1 カヘナホチ ヒチヤナヌマメヲハ ヘマヨユヤリ ヘヲモヤノヤノ ヤヲフリヒノ ヘチフヲ フヲヤナメノ ラヲト a トマ z ヤチ - ヲ _ Bucket_Error2 チヤナヌマメヲム レ ホチレラマタ %s ユヨナ ヲモホユ、 Bucket_Error3 ヤラマメナホマ ヒチヤナヌマメヲタ レ ホチレラマタ %s Bucket_Error4 ラナトヲヤリ ツユトリ-フチモヒチ ホナミマメマヨホ、 モフマラマ Bucket_Error5 ナメナハヘナホマラチホマ ヒチヤナヌマメヲタ %s ホチ %s Bucket_Error6 ホノンナホマ ヒチヤナヌマメヲタ %s Bucket_Title ラヲヤ Bucket_BucketName チヤナヌマメヲム Bucket_WordCount ヲフリヒヲモヤリ モフヲラ Bucket_WordCounts ヲフリヒマモヤヲ モフヲラ Bucket_UniqueWords ホヲヒチフリホヲ Bucket_SubjectModification ヘヲホタラチヤノ ヤナヘユ Bucket_ChangeColor マフヲメ Bucket_NotEnoughData ナトマモヤチヤホリマ トチホノネ Bucket_ClassificationAccuracy マ゙ホヲモヤリ ヒフチモノニヲヒチテヲァ Bucket_EmailsClassified メマヒフチモノニヲヒマラチホマ フノモヤヲラ Bucket_EmailsClassifiedUpper メマヒフチモノニヲヒマラチホマ フノモヤヲラ Bucket_ClassificationErrors マヘノフマヒ ヒフチモノニヲヒチテヲァ Bucket_Accuracy マ゙ホヲモヤリ Bucket_ClassificationCount ヲフリヒヲモヤリ Bucket_ClassificationFP ナミメチラノフリホヲ マミチトチホホム Bucket_ClassificationFN ナミメチラノフリホヲ メマヘチネノ Bucket_ResetStatistics ヒノホユヤノ モヤチヤノモヤノヒユ Bucket_LastReset マモヤチホホ、 モヒノホユヤマ Bucket_CurrentColor %s ミマヤマ゙ホノハ ヒマフヲメ %s Bucket_SetColorTo モヤチホマラノヤノ %s ヒマフヲメ トフム %s Bucket_Maintenance ミメチラフヲホホム ヒチヤナヌマメヲムヘノ Bucket_CreateBucket ヤラマメノヤノ ヒチヤナヌマメヲタ レ ヲヘナホナヘ Bucket_DeleteBucket ホノンノヤノ ヒチヤナヌマメヲタ ヲヘナホマラチホユ Bucket_RenameBucket ナメナハヘナホユラチヤノ ヒチヤナヌマメヲタ ヲヘナホマラチホユ Bucket_Lookup ヲトヌフムホユヤノ Bucket_LookupMessage ホチハヤノ モフマラマ ラ ヒチヤナヌマメヲムネ Bucket_LookupMessage2 ナレユフリヤチヤ ミマロユヒユ Bucket_LookupMostLikely %s ホチハヲヘマラヲメホヲロナ ミマムラフム、ヤリモム ラ %s Bucket_DoesNotAppear

%s ホナ レ'ムラフム、ヤリモム ラ ヨマトホヲハ ヒチヤナヌマメヲァ Bucket_DisabledGlobally 醂マツチフリホマ レチツマメマホナホマ Bucket_To トマ Bucket_Quarantine チメチホヤノホ SingleBucket_Title マトメマツノテヲ トフム %s SingleBucket_WordCount ヲフリヒヲモヤリ モフヲラ ラ ヒチヤナヌマメヲァ SingleBucket_TotalWordCount チヌチフリホチ ヒヲフリヒヲモヤリ モフヲラ SingleBucket_Percentage ヲトモマヤマヒ ラヲト ラモリマヌマ SingleBucket_WordTable チツフノテム モフヲラ トフム %s SingleBucket_Message1 フマラチ レ レヲメマ゙ヒチヘノ (*) ラノヒマメノモヤマラユラチフノモム ミメノ ヒフチモノニヲヒチテヲァ ラ テヲハ POPFile モナモヲァ. フチテホヲヤリ ミマ モフマラユ, ンマツ ミマツヂノヤノ ハマヌマ ラヲメマヌヲトホヲモヤリ ユ ラモヲネ ヒチヤナヌマメヲムネ. SingleBucket_Unique %s ユホヲヒチフリホナ SingleBucket_ClearBucket ノフユ゙ノヤノ ラモヲ モフマラチ Session_Title POPFile モナモヲム レチヒヲボノフチモム Session_Error チロチ モナモヲム POPFile レチヒヲボノフチモム. 翡 ヘマヌフマ ヤメチミノヤノモム ミメノ レユミノホテヲ ヤチ レチミユモヒユ POPFile チフナ ミメノ ラヲトヒメノヤマヘユ ミナメナヌフムトヂヲ. フチテホヲヤリ ホチ マトホマヘユ レ ミマモノフチホリ ラヌマメヲ ンマツ ミメマトマラヨノヤノ メマツマヤユ レ POPFile. View_Title ナメナヌフムト マトホマヌマ ミマラヲトマヘフナホホム Header_MenuSummary 耜 ヤチツフノテム - テナ ホチラヲヌチテヲハホナ ヘナホタ, ンマ ホチトチ、 トマモヤユミ トマ ヒマヨホマァ レ メヲレホノネ モヤマメヲホマヒ テナホヤメユ ユミメチラフヲホホム. History_MainTableSummary 耜 ヤチツフノテム ミマヒチレユ、 チラヤマメチ ヤチ ヤナヘユ ンマハホマ ミメノハホムヤノネ ミマラヲトマヘフナホリ ヤチ トマレラマフム、 ァネ ミナメナヌフムホユヤノ ヤチ ミナメナヒフチモノニヲヒユラチヤノ. フチテホユラロノ ホチ ヤナヘヲ ラノ マヤメノヘチ、ヤナ ミマラホノハ ヤナヒモヤ ミマラヲトマヘフナホホム, メチレマヘ レ ヲホニマメヘチテヲ、タ, ゙マヘユ ハマヌマ ヤチヒ ツユフマ ミメマヒフチモノニヲヒマラチホマ. ヤマラミナテリ 'チ、 ツユヤノ' トマレラマフム、 チヘ ラヒチレチヤノ, ムヒヲハ ヒチヤナヌマメヲァ ホチフナヨノヤリ ミマラヲトマヘフナホホム, チツマ ラヲトヘヲホノヤノ ヤユ レヘヲホユ. ヤマラミナテリ 'ノフユ゙ノヤノ' トマレラマフム、 ラノフユ゙ノヤノ ミナラホナ ミマラヲトマヘフナホホム レ ヲモヤマメヲァ ムヒンマ ラノ ァネ ツヲフリロナ ホナ ミマヤメナツユ、ヤナ. History_OpenMessageSummary 耜 ヤチツフノテム ヘヲモヤノヤリ ミマラホノハ ヤナヒモヤ ミマラヲトマヘフナホホム, レ モフマラチヘノ ンマ ラノヒマメノモヤマラユタヤリモム トフム ヒフチモノニヲヒチテヲァ ミヲトモラヺナホヲ ユ ラヲトミマラヲトホマモヤヲ トマ ヒチヤナヌマメヲァ ホチハラヲトミマラヲトホヲロヲハ ヒマヨホマヘユ. Bucket_MainTableSummary 耜 ヤチツフノテム レチツナレミナ゙ユ、 マヌフムト ヒチヤナヌマメヲハ ヒフチモノニヲヒチテヲァ. マヨナホ メムトマヒ ミマヒチレユ、 ヲヘ'ム ヒチヤナヌマメヲァ, レチヌチフリホユ ヒヲフリヒヲモヤリ モフヲラ トフム ヤヲ、ァ ヒチヤナヌマメヲァ, ミマヤマ゙ホユ ヒヲフリヒヲモヤリ ユホヲヒチフリホノネ モフヲラ ラ ヒマヨホヲハ ヒチヤナヌマメヲァ, ミメノレホチヒ ヤマヌマ, ム゙ノ ツユトナ ヘマトノニヲヒユラチヤノモム ヤナヘチ ミマラヲトマヘフナホホム ミメノ ヒフチモノニヲヒチテヲァ ラ ヤユ ヒチヤナヌマメヲタ, ゙ノ ミメマラマトノヤノ ヒチメチホヤノホ ミマラヲトマヘフナホホムヘ マヤメノヘチホノヘ ラ ヤユ ヒチヤナヌマメヲタ, ヲ ヤチツフノテタ トフム ラノツマメユ ヒマフリマメユ, ムヒノハ ラノヒマメノモヤマラユ、ヤリモム ミメノ ラヲトマツメチヨナホホヲ ツユトリ-゙マヌマ ンマ モヤマモユ、ヤリモム ヤマァ ヒチヤナヌマメヲァ ラ テナホヤメヲ ユミメチラフヲホホム. Bucket_StatisticsTableSummary 耜 ヤチツフノテム レチツナレミナ゙ユ、 ヤメノ ツフマヒノ モヤチヤノモヤノヒノ レチヌチフリホマァ ナニナヒヤノラホマモヤヲ POPFile. ナメロノハ, 、 ミメマ ヤナ, ホチモヒヲフリヒノ ヤマ゙ホマタ 、 ヒフチモノニヲヒチテヲム, トメユヌノハ - ミメマ ヤナ, モヒヲフリヒノ ミマラヲトマヘフナホリ ミメマヒフチモノニヲヒマラチホマ, ヲ ラ ムヒヲ ヒチヤナヌマメヲァ, ヲ ヤメナヤヲハ - モヒヲフリヒノ モフヲラ 、 ラ ヒマヨホヲハ ヒチヤナヌマメヲァ, ヤチ ムヒチ ァネ ミメマテナホヤホチ トマフム. Bucket_MaintenanceTableSummary 耜 ヤチツフノテム ヘヲモヤノヤリ ニマメヘノ, ンマ トマレラマフムタヤリ モヤラマメタラチヤノ, レホノンユラチヤノ ヤチ ミナメナハヘナホマラユラチヤノ ヒチヤナヌマメヲァ, ヲ ロユヒチヤノ モフマラマ ユ ラモヲネ ヒチヤナヌマメヲムネ, ンマツ ミマツヂノヤノ ハマヌマ ラヲトホマモホユ ヲヘマラヲメホヲモヤリ. Bucket_AccuracyChartSummary 耜 ヤチツフノテム ヌメチニヺホマ ラヲトマツメチヨチ、 ヤマ゙ホヲモヤリ ヒフチモノニヲヒチテヲァ ミマラヲトマヘフナホリ Bucket_BarChartSummary 耜 ヤチツフノテム ヌメチニヺホマ ラヲトマツメチヨチ、 ラヲトモマヤヒマラユ トマフタ ヒマヨホマァ マヒメナヘマァ ヒチヤナヌマメヲァ. マホチ ラノヒマメノモヤマラユ、ヤリモム ヲ トフム レチヌチフリホマァ ヒヲフリヒマモヤヲ ミマラヲトマヘフナホリ, ヲ レチヌチフリホマァ ヒヲフリヒマモヤヲ モフヲラ. Bucket_LookupResultsSummary 耜 ヤチツフノテム ミマヒチレユ、 ヲヘマラヲメホマモヤヲ チモマテヲハマラチホヲ レ ヒマヨホマヨホノヘ マヒメナヘノヘ モフマラマヘ レ モユヒユミホマモヤヲ. 萠ム ヒマヨホマァ ヒチヤナヌマメヲァ, ラヲホチ ミマヒチレユ、 ゙チモヤマヤユ レ ムヒマタ レ'ムラフム、ヤリモム ヤナ モフマラマ, ヲヘマラヲメホヲモヤリ, ンマ ラマホマ ヤメチミノヤリモム ラ ヤヲハ ヒチヤナヌマメヲァ, ヤチ レチヌチフリホノハ ラミフノラ ホチ ツチフノ ヒチヤナヌマメヲァ, ムヒツノ モフマラマ ヲモホユラチフマ ラ ミマラヲトマヘフナホホヲ. Bucket_WordListTableSummary 耜 ヤチツフノテム レチツナレミナ゙ユ、 モミノモマヒ ユモヲネ モフヲラ トフム ミナラホマァ ヒチヤナヌマメヲァ, レヌメユミマラチホヲ ミマ ミナメロヲハ フヲヤナメヲ ラ ヒマヨホマヘユ メムトヒユ. Magnet_MainTableSummary 耜 ヤチツフノテム ミマヒチレユ、 モミノモマヒ ヘチヌホヲヤヲラ ンマ ラノヒマメノモヤマラユタヤリモム トフム チラヤマヘチヤノ゙ホマァ ヒフチモノニヲヒチテヲァ ミマラヲトマヘフナホホム レヌヲトホマ ラモヤチホマラフナホノネ ミメチラノフ. マヨナホ メムトマヒ ミマヒチレユ、 ムヒ ラノレホヂナホマ ヘチヌホヲヤ, ムヒチ ヒチヤナヌマメヲム ハマヘユ ミメノレホヂナホチ, ヤチ ヒホマミヒチ, ンマツ レホノンノヤノ ヘチヌホヲヤ. Configuration_MainTableSummary 耜 ヤチツフノテム ヘヲモヤノヤリ ヒヲフリヒチ ニマメヘ ンマ トマレラマフムタヤリ ラチヘ ヒマホヤメマフタラチヤノ ヒマホニヲヌユメチテヲタ POPFile. Configuration_InsertionTableSummary 耜 ヤチツフノテム ヘヲモヤノヤリ ヒホマミヒノ ンマ ラノレホヂチタヤリ ムヒヲ ヘマトノニヲヒチテヲァ レトヲハモホタタヤリモム ホチト レチヌマフマラヒチヘノ ゙ノ ヤナヘマタ ミマラヲトマヘフナホホム ミナメナト ヤノヘ, ムヒ ラマホマ ミナメナトチ、ヤリモム トマ ミマロヤマラマヌマ ヒフヲ、ホヤチ. Security_MainTableSummary 耜 ヤチツフノテム レチツナレミナ゙ユ、 ホチツヲメ ミチメチヘナヤメヲラ, ムヒヲ ラミフノラチタヤリ ホチ ツナレミナヒユ ユモヲ、ァ ヒマホニヲヌユメチテヲァ POPFile, ゙ノ ラヲホ ミマラノホナホ チラヤマヘチヤノ゙ホマ ミナメナラヲメムヤノ レチ マホマラフナホホムヘノ ミメマヌメチヘノ, ヲ ゙ノ ラヲトモノフチヤノ モヤチヤノモヤノヒユ ミメマ ナニナヒヤノラホヲモヤリ POPFile ラ テナホヤメチフリホユ ツチレユ トチホノネ チラヤマメチ ミメマヌメチヘノ レチトフム レチヌチフリホマァ ヲホニマメヘチテヲァ. Advanced_MainTableSummary 耜 ヤチツフノテム レチツナレミナ゙ユ、 モミノモマヒ モフヲラ, ムヒヲ POPFile ヲヌホマメユ、 ミメノ ヒフチモノニヲヒチテヲァ ミマラヲトマヘフナホホム ゙ナメナレ ァネ ラヲトホマモホユ ゙チモヤマヤユ ラ ミマラヲトマヘフナホホヲ ラレチヌチフヲ. マホノ レヲツメチホヲ ラ メムトノ ミマ ミナメロヲハ フヲヤナメヲ モフヲラ. popfile-1.1.3+dfsg/languages/Turkce.msg0000664000175000017500000007073111624177330017274 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Translated by / ヌeviri: # Zeynel Abidin ヨztrk # POPFile 0.22.0 Turkish Translation # Identify the language and character set used for the interface LanguageCode tr LanguageCharset ISO-8859-9 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply Uygula On Ak Off Kapal TurnOn A TurnOff Kapat Add Ekle Remove Kaldr Previous ヨnceki Next Sonraki From Kimden Subject Konu Cc Bilgi Classification Snflandrma Reclassify Tekrar Snflandr Probability Olaslk Scores Puanlar QuickMagnets HzlMknats Undo Geri Al Close Kapat Find Bul Filter Filtrele Yes Evet No Hayr ChangeToYes Evet olarak deitir ChangeToNo Hayr olarak deitir Bucket Kategori Magnet Mknats Delete Sil Create Olutur To Kime Total Toplam Rename Ad Deitir Frequency Frekans Probability Olaslk Score Puan Lookup Arama Word Szck Count Miktar Update Gncelle Refresh Yenile FAQ Sk Sorulan Sorular ID Kimlik Date Tarih Arrived Alnma Size Boyut # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title POPFile Denetim Merkezi Header_Shutdown POPFile' Kapat Header_History Ge輓i Header_Buckets Kategoriler Header_Configuration Yaplandrma Header_Advanced Gelimi Header_Security Gvenlik Header_Magnets Mknatslar Footer_HomePage POPFile Web Sayfas Footer_Manual Klavuz Footer_Forums Forumlar Footer_FeedMe Ba Yap Footer_RequestFeature ヨzellik ンsteinde Bulun Footer_MailingList Posta Listesi Footer_Wiki Belgeler Configuration_Error1 Ayrc karakter tek bir karakter olmaldr Configuration_Error2 Kullanc arayz portu 1 ile 65535 arasnda bir say olmaldr Configuration_Error3 POP3 dinleme portu 1 ile 65535 arasnda bir say olmaldr Configuration_Error4 Sayfa boyutu 1 ile 1000 arasnda bir say olmaldr Configuration_Error5 Ge輓iteki gn says 1 ile 366 arasnda bir say olmaldr Configuration_Error6 TCP zaman am 10 ile 1800 arasnda bir say olmaldr Configuration_Error7 XML RPC dinleme portu 1 ile 65535 arasnda bir numara olmaldr Configuration_Error8 SOCKS V proxy port says 1 ve 65535 arasnda bir say olmaldr Configuration_POP3Port POP3 dinleme portu Configuration_POP3Update POP3 portu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Configuration_XMLRPCUpdate XML-RPC portu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Configuration_XMLRPCPort XML-RPC dinleme portu Configuration_SMTPPort SMTP dinleme portu Configuration_SMTPUpdate SMTP portu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Configuration_NNTPPort NNTP dinleme portu Configuration_NNTPUpdate NNTP portu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Configuration_POPFork Ayn anda yaplan POP3 balantlarna izin ver Configuration_SMTPFork Ayn anda yaplan SMTP balantlarna izin ver Configuration_NNTPFork Ayn anda yaplan NNTP balantlarna izin ver Configuration_POP3Separator POP3 sunucu:port:kullanc ayrc karakteri Configuration_NNTPSeparator NNTP sunucu:port:kullanc ayrc karakteri Configuration_POP3SepUpdate POP3 ayrcs %s olarak gncellendi Configuration_NNTPSepUpdate NNTP ayrcs %s olarak gncellendi Configuration_UI Kullanc arayz web portu Configuration_UIUpdate Kullanc arayz web portu %s olarak gncellendi, bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Configuration_History Sayfa bana mesaj says Configuration_HistoryUpdate Sayfa bana mesaj says %s olarak gncellendi Configuration_Days Ge輓iin saklanaca gn says Configuration_DaysUpdate Ge輓iin saklanaca gn says %s olarak gncellendi Configuration_UserInterface Kullanc Arayz Configuration_Skins D Grnmler Configuration_SkinsChoose D grnm se輅n Configuration_Language Dil Configuration_LanguageChoose Dil se輅n Configuration_ListenPorts Modl Se軻nekleri Configuration_HistoryView Ge輓i Grnm Configuration_TCPTimeout Balant Zaman Am Configuration_TCPTimeoutSecs Saniye olarak balant zaman am Configuration_TCPTimeoutUpdate Zaman am %s saniye olarak gncellendi Configuration_ClassificationInsertion Mesaja Metin Ekleme Configuration_SubjectLine Konu satr deitirilmesi Configuration_XTCInsertion X-Text-Classification ワst bilgisi Configuration_XPLInsertion X-POPFile-Link ワst bilgisi Configuration_Logging Gnlk tutma Configuration_None Kapal Configuration_ToScreen Ekrana Configuration_ToFile Dosyaya Configuration_ToScreenFile Ekrana ve Dosyaya Configuration_LoggerOutput Gnlk kts Configuration_GeneralSkins D grnmler Configuration_SmallSkins K錮k D Grnmler Configuration_TinySkins Daha K錮k D Grnmler Configuration_CurrentLogFile <imdiki gnlk dosyas> Configuration_SOCKSServer SOCKS V proxy sunucusu Configuration_SOCKSPort SOCKS V proxy port Configuration_SOCKSPortUpdate SOCKS V proxy port %s olarak gncellendi Configuration_SOCKSServerUpdate SOCKS V proxy sunucusu to %s olarak gncellendi Configuration_Fields Ge輓i stunlar Advanced_Error1 '%s' zaten Yoksaylan Szckler listesinde Advanced_Error2 Yoksaylan kelimeler sadece harfleri, saylar, ., _, -, veya @ karakterlerini i軻rebilir Advanced_Error3 '%s' Yoksaylan Kelimeler listesine eklendi Advanced_Error4 '%s' Yoksaylan Kelimeler i軻rsinde bulunmuyor Advanced_Error5 '%s' Yoksaylan Kelimeler listesinden silindi Advanced_StopWords Yoksaylan Kelimeler Advanced_Message1 POPFile aadaki sk軋 kullanlan kelimeleri yok sayar: Advanced_AddWord Kelime ekle Advanced_RemoveWord Kelime kaldr Advanced_AllParameters Tm POPFile Parametreleri Advanced_Parameter Parametre Advanced_Value Deer Advanced_Warning Bu POPFile parametrelerinin tam bir listesidir. Sadece ileri seviye kullanclar i輅ndir: herhangi bir eyi deitirebilir ve gncelleyebilirsiniz; ge軻rlilik kontrol yaplmaz. Advanced_ConfigFile Yaplandrma dosyas: History_Filter  (u an %s kategorisi grntleniyor) History_FilterBy Filtreleme History_Search  (kimden/konu %s i輅n arand) History_Title Son Mesajlar History_Jump Mesaja git History_ShowAll Tmn Gster History_ShouldBe Byle olmal History_NoFrom kimden satr bulunmuyor History_NoSubject konu satr bulunmuyor History_ClassifyAs Snflandr History_MagnetUsed Mknats kullanld History_MagnetBecause Mknats kullanld

%s olarak snflandrld (mknats %s nedeniyle)

History_ChangedTo %s olarak deitirildi History_Already %s olarak tekrar snflandrld History_RemoveAll Tmn Kaldr History_RemovePage Sayfay Kaldr History_RemoveChecked Se輅leni Kaldr History_Remove Ge輓iteki girdileri kaldrmak i輅n tklayn: History_SearchMessage Kimden/Konu Ara History_NoMessages Mesaj yok History_ShowMagnet mknatslanm History_Negate_Search Aramay/filtreyi ters 軻vir History_Magnet  (u an mknats ile snflandrlm mesajlar grntleniyor) History_NoMagnet  (u an mknats ile snflandrlmam mesajlar grntleniyor) History_ResetSearch Aramay Sfrla History_ChangedClass Byle snflandrlabilir History_Purge ゙imdi Sil History_Increase Arttr History_Decrease Azalt History_Column_Characters Kimden, Kime, Bilgi ve Konu stunlarnn geniliini deitir History_Automatic Otomatik History_Reclassified Tekrar snflandrlm History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Parola Password_Enter Parolay girin Password_Go Tamam! Password_Error1 Yanl parola Security_Error1 Port 1 ile 65535 arasnda bir numara olmaldr Security_Stealth Gizli Mod/Sunucu ヌalmas Security_NoStealthMode Hayr (Gizli Mod) Security_StealthMode (Gizli Mod) Security_ExplainStats (Bu ayar ak olduunda, POPFile gnde bir kez olmak zere u deerleri getpopfile.org i輅ndeki bir koda gnderir; bc (sahip olduunuz toplam kategori says), mc (POPFile'n snflandrd toplam mesaj says) ve ec (toplam snflandrma hatas says). Bu bilgiler bir dosyada saklanr, bunlar kullanclarn POPFile' nasl kullandn ve ne kadar iyi 軋lt hakknda istatistikler yaynlamak amacyla kullanacam. Web sunucum gnlk dosyalarn yaklak 5 gn saklar ve siler; istatistikler ve IP adresleri arasnda herhangi bir balant biriktirmemekteyim.) Security_ExplainUpdate (Bu ayar ak olduunda, POPFile gnde bir kez olmak zere u deeri getpopfile.org i輅ndeki bir koda gnderir; ma (yklediiniz POPFile'n byk srm numaras), mi (yklediiniz POPFile'n k錮k srm numaras) ve bn (yklediiniz POPFile'n yap [build] numaras). Yeni bir srm bulunduunda POPFile, sayfann stnde gsterilen, grafik bi輅minde bir cevap alr. Web sunucum gnlk dosyalarn yaklak 5 gn saklar ve siler; gncelleme kontrolleri ve IP adresleri arasnda herhangi bir balant biriktirmemekteyim.) Security_PasswordTitle Kullanc Arayz Parolas Security_Password Parola Security_PasswordUpdate Parola %s olarak gncellendi Security_AUTHTitle Uzaktaki Sunucular Security_SecureServer POP3 SPA/AUTH sunucusu Security_SecureServerUpdate POP3 SPA/AUTH gvenli sunucusu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Security_SecurePort POP3 SPA/AUTH portu Security_SecurePortUpdate POP3 SPA/AUTH portu %s olarak gncellendi; bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Security_SMTPServer SMTP zincir sunucusu Security_SMTPServerUpdate SMTP zincir sunucusu %s olarak gncellendi, bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Security_SMTPPort SMTP zincir portu Security_SMTPPortUpdate SMTP zincir portu %s olarak gncellendi, bu deiiklik siz POPFile' yeniden balatana kadar etkili olmayacaktr Security_POP3 Uzak bilgisayarlardan POP3 balantlarn kabul et (POPFile' yeniden balatmak gerekir) Security_SMTP Uzak bilgisayarlardan SMTP balantlarn kabul et (POPFile' yeniden balatmak gerekir) Security_NNTP Uzak bilgisayarlardan NNTP balantlarn kabul et (POPFile' yeniden balatmak gerekir) Security_UI Uzak bilgisayarlardan HTTP (Kullanc Arayz) balantlarn kabul et (POPFile' yeniden balatmak gerekir) Security_XMLRPC Uzak bilgisayarlardan XML-RPC balantlarn kabul et (POPFile' yeniden balatmak gerekir) Security_UpdateTitle Otomatik Gncelleme Kontrol Security_Update POPFile gncellemesi i輅n her gn kontrol et Security_StatsTitle ンstatistik Raporlama Security_Stats Her gn istatistik gnder Magnet_Error1 Mknats '%s', kategori '%s' i軻rsinde zaten var Magnet_Error2 Yeni '%s' mknats, '%s' mknatsyla ('%s' kategorisinde) 軋kyor. Bu belirsiz sonu輙ara yol a軋bilir. Yeni mknats eklenmedi. Magnet_Error3 Yeni mknats olutur: '%s' Kategori: '%s' Magnet_CurrentMagnets ゙u Anki Mknatslar Magnet_Message1 Bu mknatslar, postann her zaman belirtilen kategori olarak snflandrlmasn salayacaktr. Magnet_CreateNew Yeni Mknats Olutur Magnet_Explanation ゙u tr mknatslar mevcuttur:
  • Kimden adresi veya isim: ヨrnein: Belirli bir adresle eletirmek i輅n zeynel@sirket.com,
    sirket.com'dan gnderen herkes ile eletirmek i輅n sirket.com,
    belirli bir kiiyle eletirmek i輅n Zeynel Abidin ヨztrk, tm Zeynel'ler ile eletirmek i輅n Zeynel yazn
  • Kime/Bilgi adres veya ad: Kimden: mknats gibidir fakat mesajdaki Kime:/Bilgi: adresi i輅ndir
  • Konu szckleri: ヨrnein: Konusunda merhaba bulunan tm mesajlarla eletirmek i輅n merhaba yazn
Magnet_MagnetType Mknats tr Magnet_Value Deer Magnet_Always Her zaman bu kategoriye gider Magnet_Jump Mknats sayfasna git Bucket_Error1 Kategori adlar sadece a'dan z'ye k錮k harfleri, 0'dan 9'a saylar, art - ve _ karakterlerini i軻rebilir Bucket_Error2 %s adl kategori zaten var Bucket_Error3 %s adnda kategori oluturuldu Bucket_Error4 Ltfen bo olmayan bir szck girin Bucket_Error5 Kategori ad deitirildi, eski ad: %s yeni ad: %s Bucket_Error6 %s kategorisi silindi Bucket_Title ヨzet Bucket_BucketName Kategori Ad Bucket_WordCount Szck Says Bucket_WordCounts Szck Saylar Bucket_UniqueWords Esiz Szck Bucket_SubjectModification Konu Deitirilmesi Bucket_ChangeColor Renk Deitir Bucket_NotEnoughData Yetersiz veri Bucket_ClassificationAccuracy Snflandrma Doruluu Bucket_EmailsClassified Snflandrlan mesaj Bucket_EmailsClassifiedUpper Snflandrlan Mesajlar Bucket_ClassificationErrors Snflandrma hatalar Bucket_Accuracy Doruluk Bucket_ClassificationCount Snflandrma Says Bucket_ClassificationFP Olumlu Yanllar Bucket_ClassificationFN Olumsuz Yanllar Bucket_ResetStatistics ンstatistikleri Sfrla Bucket_LastReset Son Sfrlama Bucket_CurrentColor %s u anki rengi %s Bucket_SetColorTo %s rengini %s rengi ile deitir Bucket_Maintenance Bakm Bucket_CreateBucket Bu isimde kategori olutur Bucket_DeleteBucket Bu isimdeki kategoriyi sil Bucket_RenameBucket Bu isimdeki kategorinin adn deitir Bucket_Lookup Arama Bucket_LookupMessage Kategoriler i軻rsinde szck arama Bucket_LookupMessage2 Arama sonu輙ar: Bucket_LookupMostLikely %s daha 輟k %s i軻rsinde grnyor Bucket_DoesNotAppear

%s hi軛ir kategoride grnmyor Bucket_DisabledGlobally Tamamen devre d Bucket_To Yeni Ad: Bucket_Quarantine Karantina SingleBucket_Title %s detaylar SingleBucket_WordCount Kategori szck says SingleBucket_TotalWordCount Toplam szck says SingleBucket_Percentage Toplama gre yzdesi SingleBucket_WordTable %s i輅n Szck Tablosu SingleBucket_Message1 Herhangi bir harfle balayan szckleri grmek i輅n o harfe tklayn. Bir szcn tm kategorilerdeki olaslklarn aramak i輅n istediiniz bir szce tklayn. SingleBucket_Unique %s esiz SingleBucket_ClearBucket Tm Kelimeleri Kaldr Session_Title POPFile Oturum Sresi Doldu Session_Error POPFile Oturum sreniz doldu. Bu, web penceresi akken POPFile' balatp durdurmak sebebiyle ger軻klemi olabilir. POPFile' kullanmaya devam etmek i輅n ltfen balantlardan birini tklayn. View_Title Tek Mesaj Grnm View_ShowFrequencies Szck frekanslarn gster View_ShowProbabilities Szck olaslklarn gster View_ShowScores Szck puanlarn gster View_WordMatrix Szck matrisi View_WordProbabilities szck olaslklar grntleniyor View_WordFrequencies szck frekanslar grntleniyor View_WordScores szck puanlar grntleniyor View_Chart Karar grafii Windows_TrayIcon POPFile simgesi Windows sistem 輹buunda gsterilsin mi? Windows_Console POPFile konsol penceresinde mi 軋ltrlsn? Windows_NextTime

Bu deiiklik, bir sonraki POPFile balangcna kadar etkili olmayacaktr Header_MenuSummary Bu tablo, denetim merkezinin farkl sayfalarna erimeyi salayan bir gzatma mensdr History_MainTableSummary Bu tablo son alnan mesajlarn gnderenlerini ve konularn grntler ve gzden ge輅rilip tekrar snflandrlmasn salar. Konu satrna tklamak, mesajn snflandrlmas hakknda bilgi ile birlikte tam mesaj metnini gsterir. 'Byle olmal' stunu, mesajn hangi kategoride olmas gerektiini se輓enizi veya bu deiiklii geri almanz salar. 'Sil' stunu, gerek duymadnz mesajlar ge輓i i軻risinden se軻rek silmenize izin verir. History_OpenMessageSummary Bu tablo, snflandrma i輅n kullanlan her kelimenin en 輟k uyuan kategoriye gre vurguland, mesajn tam metnini i軻rir. Bucket_MainTableSummary Bu tablo, snflandrma kategorileri hakknda bir zet sunar. Her sra kategori adn, kategori i輅n toplam szck saysn, her kategorideki tek szck saysn, mesajn bu kategori ile snflandrldnda konu satrnn deitirilip deitirilmeyeceini, bu kategoride alnan mesajlarn karantinaya alnp alnmayacan ve bu kategori ile ilgili Denetim Merkezinde kullanlacak rengi se輓enizi salar. Bucket_StatisticsTableSummary Bu tablo POPFile'n tm performans hakknda grup istatistik sunar. Birincisi snflamann ne kadar doru olduu, ikincisi ka mesajn snflandrld ve hangi kategorinin atandn ve 錮ncs her kategoride ka szcn bulunduu ve ilgili yzdelerinin ka olduunu gsterir. Bucket_MaintenanceTableSummary Bu tablo, kategorileri oluturabileceiniz, silebileceiniz veya adn deitirebileceiniz formlar i軻rir ve tm kategorilerde bir kelimeyi aratp ilgili olaslklarn grmebilmenizi salar. Bucket_AccuracyChartSummary Bu tablo, mesaj snflandrmasnn doruluunu grafik zerinde gsterir. Bucket_BarChartSummary Bu tablo, her farkl kategori i輅n ayrlan yzdeyi grafik olarak grntler. Bu hem snflandrlan mesaj says hem de toplam szck saylar i輅n kullanlr. Bucket_LookupResultsSummary Bu tablo, szck listesinden verilen herhangi bir szck ile ilikili olaslklar grntler. Her kategori i輅n, bu kelimenin meydana geldii frekans, bu kategoride meydana gelme olasl ve bu szck mesajda bulunuyorsa puan zerindeki tam etkisini gsterir. Bucket_WordListTableSummary Bu tablo, bir kategoriye zg tm szcklerin, her satr i輅n ortak ilk harf ile dzenlenmi listesini sunar. Magnet_MainTableSummary Bu tablo, mesajlar sabit kurallara gre otomatik olarak snflandrmakta kullanlan mknatslarn listesini gsterir. Her satr mknatsn nasl tanmlandn, bunun i輅n hangi kategorinin se輅ldiini grntler ve mknats silmek i輅n bir dme gsterir. Configuration_MainTableSummary Bu tablo, POPFile'n yaplandrmasn denetlemenize izin veren baz formlar i軻rir. Configuration_InsertionTableSummary Bu tablo, mesajn posta programna (client) iletilmeden nce st bilgilerde veya konu satrnda baz deiikliklerinin yaplp yaplmayacan belirleyen dmeler i軻rir. Security_MainTableSummary Bu tablo, otomatik olarak program gncellemelerinin kontrol edilip edilmeyecei, POPFile'n performans hakkndaki istatistiklerin genel bilgi i輅n program yapmcsnn veri deposu merkezine gnderilip gnderilmeyecei hakknda POPFile'n tm yaplandrmasnn gvenliini etkileyecek denetim gruplar salar. Advanced_MainTableSummary Bu tablo, POPFile'n genelde mesajdaki greceli frekanslar nedeniyle yoksayd szcklerin listesini sunar. Bunlar her satrda szcn ilk harfine gre dzenlenmitir. Imap_Bucket2Folder %s kategorisindeki posta %s klasrne gider Imap_MapError Bir klasre birden fazla kategori atayamazsnz! Imap_Server IMAP sunucusu: Imap_ServerNameError Ltfen sunucunun adn girin! Imap_Port IMAP Sunucu portu: Imap_PortError Ltfen ge軻rli bir port numaras girin! Imap_Login IMAP hesab oturum a輓a ad: Imap_LoginError Ltfen bir kullanc/oturum a輓a ad girin! Imap_Password IMAP hesab parolas: Imap_PasswordError Ltfen sunucu i輅n bir parola girin! Imap_Expunge Silinen mesajlar izlenen klasrlerden kaldr. Imap_Interval Gncelleme aral, saniye: Imap_IntervalError Ltfen 10 ile 3600 saniye arasnda bir say girin. Imap_Bytelimit Her mesajn snflandrlmasnda kullanlacak bayt. Tm mesaj i輅n 0 girin: Imap_BytelimitError Ltfen bir say girin. Imap_RefreshFolders Klasr listesini yenile Imap_Now imdi! Imap_UpdateError1 Oturum alamyor. Ltfen oturum a輓a adn ve parolay kontrol edin. Imap_UpdateError2 Sunucuyla balant kurulamyor. Ltfen sunucu adn ve port numarasn kontrol edin ve aa bal olduunuzdan emin olun. Imap_UpdateError3 Ltfen nce balant detaylarn ayarlayn. Imap_NoConnectionMessage Ltfen nce balant detaylarn ayarlayn. Bunu yaptktan sonra, bu sayfada daha fazla se軻nek belirecektir. Imap_WatchMore a folder to list of watched folders Imap_WatchedFolder ンzlenilen klasr numaras Shutdown_Message POPFile kapatld Help_Training POPFile' ilk kullandnzda o hi軛ir bilgiye sahip deildir ve eitime ihtiyac vardr. POPFile her kategori i輅n mesajlar ile eitilmelidir. Eitim, POPFile bir mesaj yanl snflandrdnda bunu doru kategori ile tekrar snflandrarak ger軻kletirilir. Bunun dnda, posta programnzn mesajlar POPFile'n snflandrmasna gre filtrelemesi i輅n ayarlamalsnz. Posta programnzn filtelerini ayarlamak hakknda bilgi POPFile Dkmantasyon Projesi adresinde bulunabilir. Help_Bucket_Setup POPFile, snflandrlmam pseudo-kategorisi dnda en az iki kategori gerektirir. POPFile' esiz yapan, ikiden fazla, istediiniz sayda kategoriye sahip olabilmenizdir. Basit bir kurulum, "spam", "kiisel", ve "i" kategorileri gibi olabilir. Help_No_More Bunu bir daha gsterme popfile-1.1.3+dfsg/languages/Svenska.msg0000664000175000017500000003214711624177330017450 0ustar danieldaniel# Copyright (c) 2003-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # This is used to get the appropriate subdirectory for the manual LanguageCode sv LanguageCharset ISO-8859-1 LanguageDirection ltr # Common words that are used on their own all over the interface Apply Verkst舁l On On Off Off TurnOn S舩t p TurnOff St舅g av Add L臠g till Remove Ta bort Previous Freg蘰nde Next N舖ta From Fr蚣 Subject トmne Classification Klassifikation Reclassify Reklassifikation Undo ナngra Close St舅g av server Find Sk Filter Filter Yes Ja No Nej ChangeToYes トndra till Ja ChangeToNo トndra till Nej Bucket Hink Magnet Magnet Delete Ta bort Create Skapa To Till Total Totalt Rename Dp om Frequency Frekvens Probability Sannolikhet Score Resultat Lookup Leta efter # The header and footer that appear on every UI page Header_Title Kontrollpanel Header_Shutdown St舅g Header_History Historia Header_Buckets Hinkar Header_Configuration Konfiguration Header_Advanced Avancerat Header_Security S臾erhet Header_Magnets Magneter Footer_HomePage Hem Footer_Manual Manual Footer_Forums Forum Footer_FeedMe ナterkoppling Footer_RequestFeature Fresl funktioner Footer_MailingList Mailinglistor Configuration_Error1 Det avskiljande tecknet kan bara vara ett tecken. Configuration_Error2 Webgr舅ssnittets post m蚶te vara ett tal mellan 1 och 65535 Configuration_Error3 POP3 porten m蚶te vara ett tal mellan 1 och 65535 Configuration_Error4 Sidans storlek m蚶te vara ett tal mellan 1 och 1000 Configuration_Error5 Antal dagar i 'histora' m蚶te vara ett tal mellan 1 och 366 Configuration_Error6 TCP timeout m蚶te vara ett tal mellan 10 och 1800 Configuration_POP3Port POP3 port Configuration_POP3Update Uppdaterade porten till %s; denna 舅dring kommer inte att g舁la frr舅 servern 舐 omstartad. Configuration_Separator Avskiljare Configuration_SepUpdate Uppdaterade det avskiljande tecknet till %s Configuration_UI Webgr舅ssnittets HTTP port Configuration_UIUpdate Uppdaterade webgr舅ssnittets HTTP port till %s; denna 舅dring kommer inte att g舁la frr舅 servern 舐 omstartad. Configuration_History Antal epost per sida Configuration_HistoryUpdate Uppdaterede antal email per sida till %s Configuration_Days Antal dagar histora skall beh虱las Configuration_DaysUpdate Uppdaterede antal dagar histora skall sparas: %s Configuration_UserInterface Gr舅ssnitt Configuration_Skins Utseende ytan Configuration_SkinsChoose V舁j tema Configuration_Language Spr虧 Configuration_LanguageChoose V舁j spr虧 Configuration_ListenPorts POP3 Configuration_HistoryView Formatera 'Historia' vyn Configuration_TCPTimeout TCP frbindelsens timeout Configuration_TCPTimeoutSecs TCP frbindelsens timeout i sekunder Configuration_TCPTimeoutUpdate Updatera TCP frbindelsens timeout till %s Configuration_ClassificationInsertion Klassifikation epost headers Configuration_SubjectLine トmnesrad modifiering Configuration_XTCInsertion X-Text-Klassification ins舩tning Configuration_XPLInsertion X-POPFile-L舅k ins舩tning Configuration_Logging Logging Configuration_None Ingen Configuration_ToScreen Till sk舐m Configuration_ToFile Till fil Configuration_ToScreenFile Till sk舐m och fil Configuration_LoggerOutput Loggning utdata Advanced_Error1 '%s' finns redan i stoppord listan Advanced_Error2 Stoppord kan bara inneh虱la alfanumeriska tecken, ., _, -, eller @ tegn Advanced_Error3 '%s' 舐 lagt till stopordlistan Advanced_Error4 '%s' finns inte i stoppordlistan Advanced_Error5 '%s' 舐 borttaget fr蚣 stoppordlistan Advanced_StopWords Stoppord Advanced_Message1 Fljande ord ignoreras av klassifikationen eftersom de frekommer ofta. Advanced_AddWord L臠g till ord Advanced_RemoveWord Ta bort ord History_Filter  (visa bara spannet %s) History_Search  (sk 舂ne fr %s) History_Title Historia History_Jump Spring til besked History_ShowAll Visa alla History_ShouldBe skulle vara History_NoFrom inget fr蚣 rad History_NoSubject iget 舂ne rad History_ClassifyAs klassificerat som History_MagnetUsed Magnet anv舅d History_ChangedTo トndrat till %s History_Already Redan reklassificerat som %s History_RemoveAll Ta bort alla History_RemovePage Ta bort sida History_Remove fr att ta bort historia History_SearchMessage Sk 舂ne History_NoMessages Inga meddelanden Password_Title Lsenord Password_Enter Indtast kodeord Password_Go Go! Password_Error1 Fel lsenord Security_Error1 Den s臾ra porten m蚶te vara ett tal mellan 1 och 65535 Security_Stealth Server krl臠e Security_NoStealthMode Nej (Lokalt l臠e) Security_ExplainStats (Data anv舅ds fr att frb舩tra servern) Security_ExplainUpdate (Om uppdatering finns tillg舅glig kommer en logotyp att visas p sidan) Security_PasswordTitle Lsenord till webgr舅ssnittet Security_Password Lsenord Security_PasswordUpdate Uppdaterar lsenord till %s Security_AUTHTitle Lsenord fr epostkonto med extra autentisering Security_SecureServer Server Security_SecureServerUpdate Uppdaterade servern till %s; denna 舅dring kommer inte att tr臈a i kraft frr舅 servern 舐 omstartad Security_SecurePort Port Security_SecurePortUpdate Uppdaterade porten till %s; denna 舅dring kommer inte att tr臈a i kraft frr舅 servern 舐 omstartad Security_POP3 Acceptera anslutningar till POP3 fr蚣 externa k舁la Security_UI Acceptera HTTP anslutningar fr蚣 extern k舁la Security_UpdateTitle Automatisk uppdatering Security_Update Sk efter uppdateringar varje dag Security_StatsTitle Statistikrapportering Security_Stats Skicka statistik till programmets skapare dagligen Magnet_Error1 Magnet '%s' finns redan i '%s' Magnet_Error2 Det nya statiska filtret '%s' kommer i konflikt med det statiska filtret '%s' i '%s' och kan skapa tvetydiga resultat. Det nya statiska filtret skapades inte. Magnet_Error3 Skapade ny magnet '%s' i '%s' Magnet_CurrentMagnets Aktuella magneter Magnet_Message1 Fljande magneter garanterar att email alltid hamnar i en viss hink. Magnet_CreateNew Skapa ny magnet Magnet_Explanation Tre typer av magneter 舐 tillg舅gliga:

  • Fr蚣 adressen eller namnet: Till exempel: test@fretag.se fr att matcha en specifik adress,
    fretag.se fr att matcha alla avs舅dare fr蚣 fretaget,
    John Doe fr att matcha en specifik person, John fr att matcha alla Johns
  • Till adressen eller namnet: Liksom ovan men fr to: eller till: -raden.
  • トmnet: Till exempel: Hej! fr att matcha alla 'Hej!' i 舂nesraden.
Magnet_MagnetType Magnettyper Magnet_Value V舐den Magnet_Always Tillhr alltid magneten Bucket_Error1 Hinkens namn kan bara inneh虱la bokst舸erna a till z (sm bokst舸er) samt - och _ Bucket_Error2 Hinken med namnet %s finns redan Bucket_Error3 Uppr舩ta hink med namnet %s Bucket_Error4 Var god fyll i ett ord Bucket_Error5 Dp inte om hinken %s till %s Bucket_Error6 Tog bort hinken %s Bucket_Title ヨverblick Bucket_BucketName Hinkens namn Bucket_WordCount Antal Bucket_WordCounts Frdelning av ord Bucket_UniqueWords Unika ord Bucket_SubjectModification トmnesrad modifiering Bucket_ChangeColor Byt f舐g Bucket_NotEnoughData Finns inte data Bucket_ClassificationAccuracy Klassifikationens exakthet Bucket_EmailsClassified Antal email Bucket_EmailsClassifiedUpper Antal email Bucket_ClassificationErrors Antal fel Bucket_Accuracy Exakthet Bucket_ClassificationCount Antal klassificeringar Bucket_ResetStatistics Nollst舁l statistiken Bucket_LastReset Frra nollst舁lningen Bucket_CurrentColor %s nuvarande f舐g 舐 %s Bucket_SetColorTo S舩t %s f舐gen till %s Bucket_Maintenance Hantering Bucket_CreateBucket Skapa hink med namnet Bucket_DeleteBucket Ta bort hink med namnet Bucket_RenameBucket Dp om hink Bucket_Lookup Hitta Bucket_LookupMessage Hitta ord i hink Bucket_LookupMessage2 Hitta fr Bucket_LookupMostLikely Det 舐 mest sannolikt att %s kommer att visas i %s Bucket_DoesNotAppear

%s kommer inte att visas i n虍on hink Bucket_DisabledGlobally Deaktivera globalt Bucket_To till Bucket_Quarantine Karant舅 SingleBucket_Title Fler detaljer fr %s SingleBucket_WordCount Totalt antal ord i hinken SingleBucket_TotalWordCount Totalt antal ord SingleBucket_Percentage Procent SingleBucket_WordTable Ordtabell fr %s SingleBucket_Message1 Markerat (*) ord har anv舅ts till klassifiering i denna sessionen. Tryck p ett ord fr att visa dess sannolikhet i alla hinkar. SingleBucket_Unique %s unique Session_Title Sessionen har g蚯t ut Session_Error Din session har g蚯t ut. Detta kan ha orsakats genom att starta och st舅ga av servern medan webl舖aren har frblivit ppen. Klicka p en av l舅karna ovan fr att forts舩ta anv舅da webgr舅snittet.popfile-1.1.3+dfsg/languages/Suomi.msg0000664000175000017500000007660011624177330017134 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode fi LanguageCharset ISO-8859-15 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply Käytä On Päällä Off Pois päältä TurnOn Laita päälle TurnOff Laita pois päältä Add Lisää Remove Poista Previous Edellinen Next Seuraava From Lähettäjä Subject Aihe Cc Kopio Classification Sanko Reclassify Luokittele uudelleen Probability Todennäköisyys Scores Pistemäärät QuickMagnets Pikamagneetit Undo Peru Close Sulje Find Etsi Filter Suodata Yes Kyllä No Ei ChangeToYes Vaihda ChangeToNo Vaihda Bucket Sanko Magnet Magneetti Delete Poista Create Luo To Vastaanottaja Total Yhteensä Rename Nimeä uudelleen Frequency Esiintymistiheys Probability Todennäköisyys Score Pistemäärä Lookup Etsi Word Sana Count Määrä Update Päivitä Refresh Virkistä tämä sivu FAQ UKK ID ID Date Päiväys Arrived Saapunut Size Koko # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands   Locale_Decimal , # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %e.%L.%y %R # The header and footer that appear on every UI page Header_Title POPFile hallinta Header_Shutdown Sulje POPFile Header_History Viestihistoria Header_Buckets Sangot Header_Configuration Asetukset Header_Advanced Erikoisasetukset Header_Security Turvallisuusasetukset Header_Magnets Magneetit Footer_HomePage POPFilen kotisivu Footer_Manual Käyttöohjeet Footer_Forums Keskustelualueet Footer_FeedMe Ruoki minua! Footer_RequestFeature Pyydä ominaisuutta Footer_MailingList Postituslista Footer_Wiki Ohjeita (englanninksi) Configuration_Error1 Erotinmerkin pitää olla yksittäinen merkki Configuration_Error2 Käyttöliittymän porttinumero pitää olla 1 ja 65535 väliltä Configuration_Error3 POP3-kuunteluportin numero pitää olla 1 ja 65535 väliltä Configuration_Error4 Sivun koon pitää olla 1 ja 1000 väliltä Configuration_Error5 Historian päivien määrä pitää olla 1 ja 366 väliltä Configuration_Error6 TCP aikakatkaisun pitää olla 10 ja 1800 väliltä Configuration_Error7 XML RPC:n kuunteluportti pitää olla 1 ja 65536 väliltä. Configuration_Error8 SOCKS V -välityspalvelimen porttinumeron pitää olla 1 ja 65535 väliltä. Configuration_POP3Port POP3-kuunteluportti Configuration_POP3Update POP3-portiksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Configuration_XMLRPCUpdate XML-RPC-portiksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Configuration_XMLRPCPort XML-RPC kuunteluportti Configuration_SMTPPort SMTP-kuunteluportti Configuration_SMTPUpdate SMTP-portiksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Configuration_NNTPPort NNTP-kuunteluportti Configuration_NNTPUpdate NNTP-portiksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Configuration_POPFork Anna käyttäjän ottaa useita samanaikaisia POP3-yhteyksiä. Configuration_SMTPFork Anna käyttäjän ottaa useita samanaikaisia SMTP-yhteyksiä. Configuration_NNTPFork Anna käyttäjän ottaa useita samanaikaisia NNTP-yhteyksiä. Configuration_POP3Separator POP3:n isäntä:portti:käyttäjä erotinmerkki Configuration_NNTPSeparator NNTP:n isäntä:portti:käyttäjä erotinmerkki Configuration_POP3SepUpdate POP3-erotinmerkiksi vaihdettu %s Configuration_NNTPSepUpdate NNTP-erotinmerkiksi vaihdettu %s Configuration_UI Käyttöliittymän porttinumero Configuration_UIUpdate Käyttöliittymän porttinumeroksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Configuration_History Viestien määrä sivua kohti Configuration_HistoryUpdate Viestien määräksi sivua kohti vaihdettu %s Configuration_Days Viestihistorian päivien lukumäärä Configuration_DaysUpdate Viestihistorian päivien lukumääräksi asetettu %s päivää Configuration_UserInterface Käyttöliittymä Configuration_Skins Ulkonäköasetukset Configuration_SkinsChoose Valitse ulkonäkö Configuration_Language Kieliasetukset Configuration_LanguageChoose Valitse kieli Configuration_ListenPorts Moduulin Asetukset Configuration_HistoryView Viestihistoria Configuration_TCPTimeout Yhteyden aikakatkaisu Configuration_TCPTimeoutSecs Yhteyden aikakatkaisu sekunteina Configuration_TCPTimeoutUpdate Yhteyden aikakatkaisuksi asetettu %s sekuntia Configuration_ClassificationInsertion Viestitekstin lisäys Configuration_SubjectLine Aiherivin
muuttaminen Configuration_XTCInsertion X-Text-Classification
-otsikon lisäys Configuration_XPLInsertion X-POPFile-Link
-otsikon lisäys Configuration_Logging Loki Configuration_None Pois päältä Configuration_ToScreen Ruudulle Configuration_ToFile Tiedostoon Configuration_ToScreenFile Ruudulle ja tiedostoon Configuration_LoggerOutput Kirjaus Configuration_GeneralSkins Tavalliset Configuration_SmallSkins Pienet Configuration_TinySkins Todella pienet Configuration_CurrentLogFile <Imuroi tämänhetkinen lokitiedosto> Configuration_SOCKSServer SOCKS V -välityspalvelimen osoite Configuration_SOCKSPort SOCKS V -välityspalvelimen portti Configuration_SOCKSPortUpdate SOCKS V -välityspalvelimen portiksi vaihdettu %s Configuration_SOCKSServerUpdate SOCKS V -välityspalvelimen osoitteeksi vaihdettu %s Configuration_Fields Viestihistorian sarakkeet Advanced_Error1 Sana '%s' on jo huomiotta jätettävien sanojen listassa Advanced_Error2 Huomiotta jätettävät sanat voivat sisältää vain kirjaimia ja numeroita sekä seuraavia merkkejä: "._-@" Advanced_Error3 Sana '%s' lisätty huomiotta jätettävien sanojen listaan Advanced_Error4 Sana '%s' ei ole huomiotta jätettävien sanojen listassa Advanced_Error5 Sana '%s' poistettu huomiotta jätettävien sanojen listasta Advanced_StopWords Huomiotta jätettävät sanat Advanced_Message1 Seuraavia sanoja ei oteta huomioon viestien luokittelussa siksi koska ne esiintyvät niin usein. Advanced_AddWord Lisää sana Advanced_RemoveWord Poista sana Advanced_AllParameters Kaikki POPFilen Parametrit Advanced_Parameter Parametri Advanced_Value Arvo Advanced_Warning Tämä on täydellinen lista POPFilen käyttämistä parametreistä. Vaihda arvoja vain jos tiedät mitä teet. Annetun tiedon oikeellisuutta ei tarkisteta. Lihavoitujen kohtien asetukset poikkeavat oletusasetuksista. Advanced_ConfigFile Asetustiedosto: History_Filter  (Näkyvissä vain sangon %s sisältö) History_FilterBy Näytä vain History_Search  (Etsitty kohdetta %s) History_Title Viimeaikaiset viestit History_Jump Siirry sivulle History_ShowAll Näytä kaikki History_ShouldBe Pitäisi olla History_NoFrom Ei lähettäjätietoa History_NoSubject Ei aihetta History_ClassifyAs Luokittele History_MagnetUsed Käytetty magneettia History_MagnetBecause Magneettia käytetty

Viesti luokiteltu sankoon %s magneetilla %s

History_ChangedTo Luokitukseksi vaihdettu %s History_Already Luokitus vaihdettu sankoon %s History_RemoveAll Poista kaikki History_RemovePage Poista sivu History_RemoveChecked Poista merkityt History_Remove Paina tästä poistaaksesi nämä viestit viestihistoriasta History_SearchMessage Etsi lähettäjien ja aiheiden joukosta History_NoMessages Ei viestejä History_ShowMagnet magneeteilla luokitellut History_Negate_Search Käännä haku/suodatin History_Magnet  (Näkyvissä vain magneeteilla luokitellut viestit) History_NoMagnet  (Näkyvissä vain magneeteilla luokittelemattomat viestit) History_ResetSearch Peruuta History_ChangedClass Luokiteltaisiin nyt sankoon History_Purge Poista nyt History_Increase Kasvata History_Decrease Pienennä History_Column_Characters Vaihda lähettäjä- vastaanottaja- kopio- ja aihekenttien leveyttä History_Automatic Automaattinen History_Reclassified Luokitusta vaihdettu History_Size_Bytes %d T History_Size_KiloBytes %.1f kT History_Size_MegaBytes %.1f MT Password_Title Salasana Password_Enter Syötä salasana Password_Go Hyväksy Password_Error1 Väärä salasana Security_Error1 Portti pitää olla 1 ja 65535 väliltä Security_Stealth Piilotila/Palvelintoiminta Security_NoStealthMode Ei (Piilotila) Security_StealthMode (Piilotila) Security_ExplainStats Kun tämä asetus on päällä, POPFile lähettää kerran päivässä seuraavat kolme arvoa osoitteeseen getpopfile.org: bc (sankojen kokonaismäärä), mc (POPFilen luokittelemien viestien määrä) ja ec (luokitteluvirheiden määrä). Näitä tietoja käytetään POPFilen käyttötavoista ja toimintatarkkuudesta kertovien tilastojen laatimiseen. Webpalvelin säilyttää lokitiedostoja noin 5:n päivän ajan, jonka jälkeen ne poistetaan. Minkäänlaista tietoa tilastojen ja IP-osoitteiden välillä ei säilytetä. Security_ExplainUpdate Kun tämä asetus on päällä, POPFile lähettää kerran päivässä seuraavat kolme arvoa osoitteeseen getpopfile.org: ma (POPFilen iso versionumero), mi (POPFilen pieni versionumero) ja bn (POPFilen käännösnumero). POPFile saa vastauksen kuvana, joka näkyy sivun ylälaidassa, kun uusi versio on saatavilla. Webpalvelin säilyttää lokitiedostoja noin 5:n päivän ajan, jonka jälkeen ne poistetaan. Minkäänlaista tietoa päivitystarkistusten ja IP-osoitteiden välillä ei säilytetä. Security_PasswordTitle Käyttöliittymän salasana Security_Password Salasana Security_PasswordUpdate Salasana vaihdettu Security_AUTHTitle Etäpalvelimet Security_SecureServer POP3 etäpalvelin (SPA/AUTH tai näkymätön välityspalvelin) Security_SecureServerUpdate POP3 etäpalvelimeksi vaihdettu %s. Security_SecurePort POP3 etäportti (SPA/AUTH tai näkymätön välityspalvelin) Security_SecurePortUpdate POP3 etäportiksi vaihdettu %s. Security_SMTPServer SMTP-ketjupalvelin Security_SMTPServerUpdate SMTP-ketjupalvelimeksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Security_SMTPPort SMTP-ketjuportti Security_SMTPPortUpdate SMTP-ketjuportiksi vaihdettu %s. Muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä. Security_POP3 Hyväksy POP3-yhteydet muilta koneilta (Vaatii POPFilen uudelleenkäynnistyksen) Security_SMTP Hyväksy SMTP-yhteydet muilta koneilta (Vaatii POPFilen uudelleenkäynnistyksen) Security_NNTP Hyväksy NNTP-yhteydet muilta koneilta (Vaatii POPFilen uudelleenkäynnistyksen) Security_UI Hyväksy HTTP-yhteydet (POPFilen hallinta) muilta koneilta (Vaatii POPFilen uudelleenkäynnistyksen) Security_XMLRPC Hyväksy XML-RPC-yhteydet muilta koneilta (Vaatii POPFilen uudelleenkäynnistyksen) Security_UpdateTitle Automaattinen päivitystarkistus Security_Update Tarkista päivittäin onko POPFilestä tullut uutta versiota. Security_StatsTitle Tilastotietojen raportointi Security_Stats Lähetä päivittäin tilastotietoja Johnille. Magnet_Error1 Magneetti '%s' on jo sangossa '%s' Magnet_Error2 Uusi magneeetti '%s' on ristiriidassa magneetin '%s' kanssa sangossa '%s' ja voisi aiheuttaa ristiriitaisia tuloksia. Magneettia ei lisätty. Magnet_Error3 Uusi magneetti, '%s', luotu sankoon '%s'. Magnet_CurrentMagnets Tämänhetkiset magneetit Magnet_Message1 Seuraavat magneetit aiheuttavat sen, että viestit luokitellaan aina määriteltyyn sankoon. Magnet_CreateNew Luo uusi magneetti Magnet_Explanation On olemassa seuraavanlaisia magneetteja:
  • Lähettäjän osoite tai nimi: esimerkiksi "erkki@esimerkki.fi" yksittäistä osoitetta varten,
    "esimerkki.fi" kaikkia niitä varten, joiden osoite päättyy "esimerkki.fi",
    "Erkki Esimerkki" yksittäistä henkilöä varten ja "Erkki" kaikkia Erkkejä varten
  • Vastaanottajan osoite tai nimi/Kopio: Samalla tavoin kuin lähettäjämagneettien kanssa, mutta vastaanottajien/kopion saavien osoitteiden kanssa
  • Sanat aiheessa: esimerkiksi "heipparallaa" kaikkia sellaisia viestejä varten, joiden aiherivillä on sana "heipparallaa".
Magnet_MagnetType Magneetin tyyppi Magnet_Value arvot Magnet_Always laitetaan aina sankoon Magnet_Jump Siirry sivulle Bucket_Error1 Sangon nimessä saa olla ainoastaan pieniä kirjaimia a:sta z:aan, numeroita, sekä merkkejä "-" ja "_" Bucket_Error2 Sanko nimeltä %s on jo olemassa Bucket_Error3 Luotiin sanko nimeltä %s Bucket_Error4 Sangon nimessä pitää olla joitakin merkkejä Bucket_Error5 Vaihdettiin sangon %s nimeksi %s Bucket_Error6 Poistettiin sanko %s Bucket_Title Sankojen asetukset Bucket_BucketName Sangon
nimi Bucket_WordCount Sanamäärä Bucket_WordCounts Sanamäärät Bucket_UniqueWords Erillisiä
sanoja Bucket_SubjectModification Aiherivin
muuttaminen Bucket_ChangeColor Sangon
väri Bucket_NotEnoughData Ei tarpeeksi tietoa Bucket_ClassificationAccuracy Luokittelutarkkuus Bucket_EmailsClassified Viestejä luokiteltu Bucket_EmailsClassifiedUpper Viestejä luokiteltu Bucket_ClassificationErrors Luokitteluvirheitä Bucket_Accuracy Tarkkuus Bucket_ClassificationCount Luokittelumäärät Bucket_ClassificationFP Väärät positiiviset Bucket_ClassificationFN Väärät negatiiviset Bucket_ResetStatistics Nollaa tilastot Bucket_LastReset Viime nollaus Bucket_CurrentColor Sangon %s tämänhetkinen väri on %s Bucket_SetColorTo Aseta sangon %s väriksi %s Bucket_Maintenance Ylläpito Bucket_CreateBucket Luo sanko nimeltä Bucket_DeleteBucket Poista sanko nimeltä Bucket_RenameBucket Muuta sangon Bucket_Lookup Etsintä Bucket_LookupMessage Etsi sanaa sangoista Bucket_LookupMessage2 Etsintätulos sanalle Bucket_LookupMostLikely Sana %s kuuluu todennäköisimmin sankoon %s Bucket_DoesNotAppear

Sanaa %s ei ole missään sangossa Bucket_DisabledGlobally Poistettu yleisesti käytöstä Bucket_To nimeksi Bucket_Quarantine Karanteeni SingleBucket_Title Sangon %s tarkemmat tiedot SingleBucket_WordCount Sangon sanamäärä SingleBucket_TotalWordCount Sanojen kokonaismäärä SingleBucket_Percentage Osuus kokonaismäärästä SingleBucket_WordTable Sanataulukko sangolle nimeltä %s SingleBucket_Message1 Tähdellä (*) merkittyjä sanoja on käytetty luokitteluun tämän istunnon aikana. Napsauta sanaa nähdäksesi sen esiintymistodennäköisyyden kaikissa sangoissa. SingleBucket_Unique %s erillistä sanaa SingleBucket_ClearBucket Poista kaikki sanat Session_Title POPFile-istunto vanhentunut Session_Error POPFile-instuntosi on vanhentunut. Tämä voi johtua siitä, että olet käynnistänyt POPFilen uudelleen niin, että selaimesi oli päällä. Napsauta ylhäällä olevia linkkejä jatkaaksesi POPFilen käyttöä. View_Title Yksittäisen viestin näkymä View_ShowFrequencies Näytä sanojen esiintymistiheys View_ShowProbabilities Näytä sanojen esiintymistodennäköisyydet View_ShowScores Näytä sanojen pistemäärät ja päätöksentekokaavio View_WordMatrix Sanamatriisi View_WordProbabilities näytössä sanojen esiintymistodennäköisyydet View_WordFrequencies näytössä sanojen esiintymistiheys View_WordScores näytössä sanojen pistemäärät View_Chart Päätöksentekokaavio Windows_TrayIcon Näytetäänkö POPFilen kuvake Windowsin tehtäväpalkissa? Windows_Console Ajetaanko POPFile komentokehoitteessa? Windows_NextTime

Tämä muutos ei tule voimaan ennen POPFilen uudelleenkäynnistystä Header_MenuSummary Tässä taulukossa on navigointivalikko jonka avulla voit käyttää POPFilen hallinnan eri sivuja. History_MainTableSummary Tässä taulukossa näkyy viime aikoina saapuneiden viestien lähettäjät ja aiheet. Viestejä voi sen avulla tutkia ja uudelleenluokitella. Aiherivin napsautuksella näkyy koko vietin teksti, sekä tietoa siitä miksi viesti luokiteltiin niin kuin luokiteltiin. "Pitäisi olla"-sarakkeen avulla voit kertoa mihin sankoon viesti kuuluu, tai kumoa muutoksen. Poista-sarakkeen avulla voit poistaa yksittäisiä viestejä viestihistoriasta, jos et tarvitse niitä enää. History_OpenMessageSummary Tässä taulukossa näkyy viestin koko teksti niin, että luokitteluun käytetyt sanat on korostettu sen mukaan mihin sankoon sana todennäköisimmin kuuluu. Bucket_MainTableSummary Tässä taulukossa näkyy yleiskuva luokittelusangoista. Joka rivi näyttää sangon nimen, sangon sanamäärän, yksittäisten sanojen määrän, muutetaanko viestin otsikkoa, jos se luokitellaan sankoon, laitetaanko sankoon kuuluvat viestit karanteeniin, sekä sankoon viitatessa käytettävän värin. Bucket_StatisticsTableSummary Tässä taulukossa on kolme tilastoa jtka kuvaavat POPFilen tehokkuutta. Ensimmäinen kertoo luokittelutarkkuuden, toinen montako vietiä on luokiteltu ja mihin sankoihin, ja kolmas kertoo montako sanaa kussakin sangossa on, ja montako prosenttia sangon sanojen määrä on kaikista sanoista. Bucket_MaintenanceTableSummary Tässä taulukossa on lomakkeita, joiden avulla voit luoda, poistaa ja nimetä sankoja ja etsiä sanaa kaikista sangoista ja tarkastaa sen todennäköisyys niissä. Bucket_AccuracyChartSummary Tässä taulukossa näkuu luokittelutarkkuus graafisesti. Bucket_BarChartSummary Tässä taulukossa näkyy eri sankojen osuudet kokonaisuudesta. Sitä käytetään sekä luokiteltujen viestien määrän esittämiseen, että sanamäärien esittämiseen. Bucket_LookupResultsSummary Tässä taulukossa näkyy sanan esiintymistodennäköisyys kaikissa sanakirjoissa. Se näyttää joka sankoa kohden sanan esiintymistiheyden ja -todennäköisyyden, sekä sanan pistemäärän mikäli se esiintyy viestissä. Bucket_WordListTableSummary Tässä taulukossa on sangon sanalista. Lista on järjestetty etukirjaimen mukaan. Magnet_MainTableSummary Tässä taulukossa näkyy viestien kiinteään luokitteluun käytettyjen magneettien lista. Joka rivillä näkyy miten magneetti on määritelty, mihin sankoon se on tarkoitettu, ja nappi magneetin poistoa varten. Configuration_MainTableSummary Tässä taulukossa on lomakkeita POPFilen asetusten muuttamiseen. Configuration_InsertionTableSummary Tässä taulukossa on nappeja, joiden avulla määritellää muutetanko vietin otsikkotietoja tai aihetta ennen kuin se annetaan email-ohjelmalle. Security_MainTableSummary Tässä taulukossa on säätöjä, joilla voit vaikuttaa POPFilen turvallisuusasetuksiin, saako POPFile tarkistaa onko uusi versio ilmestynyt, ja saako POPFilen toiminnasta kertovia tilastoja lähettää ohjelman tekijän keskustietokantaan. Advanced_MainTableSummary Tässä taulukossa on lista sanoista, jotka POPFile jättää huomiotta niiden yleisyyden takia. Ne on järjestetty aakkosjärjestykseen. Imap_Bucket2Folder Sangon %s viestit menevät kansioon Imap_MapError Hakemistoa kohti voi asettaa vain yhden sangon. Imap_Server IMAP-palvelimen osoite: Imap_ServerNameError Täytä palvelimen osoite. Imap_Port IMAP-palvelimen portti: Imap_PortError Täytä palvelimen portti. Imap_Login IMAP-tilin tunnus: Imap_LoginError Täytä käyttäjätunnus. Imap_Password IMAP-tilin salasana: Imap_PasswordError Täytä palvelimen salasana. Imap_Expunge Poista viestit vahdituista kansioista. Imap_Interval Päivitysväli sekunneissa. Imap_IntervalError Täytä päivitysväli 10 ja 3600 sekunnin väliltä. Imap_Bytelimit Luokitteluun käytettävä tavumäärä. Kirjoita 0 (nolla), jos haluat käyttää koko viestiä: Imap_BytelimitError Täytä numero. Imap_RefreshFolders Päivitä kansiolista. Imap_Now nyt Imap_UpdateError1 Kirjautuminen epäonnistui. Tarkista tunnus ja salasana. Imap_UpdateError2 Yhteydenotto palvelimeen epäonnistui. Tarkista osoite ja porttinumero ja varmista, että internetyhteys on avattu. Imap_UpdateError3 Täytä ensin yhteydenmuodostusasetukset. Imap_NoConnectionMessage Täytä ensin yhteydenmuodostusasetukset. Sivulle ilmestyy sen jälkeen lisäasetuksia. Imap_WatchMore kansio vahdittujen kansioiden listaan Imap_WatchedFolder Vahdittu kansio no Shutdown_Message POPFile on sammutettu Help_Training Kun käytät POPFileä ensimmäistä kertaa, se ei tiedä mitään ja vaatii opetusta. POPFilelle pitää opettaa miltä eri sankojen viestit näyttävät. POPFile oppii, kun korjaat sen tekemiä virheitä luokittelemalla väärin luokitellut viestit oikeaan sankoon. Lisäksi sinun pitää lisätä käyttämääsi sähköpostiohjelmaan suodattimia, joka suodattavat viestit POPFilen luokitusten mukaan. Englanninkielistä apua suodatinten tekoon löytyy POPFilen dokumentointiprojektista. Help_Bucket_Setup POPFile vaatii vähintään kaksi sankoa unclassified (luokittelematon) -nimisen pseudosangon lisäksi. POPFile voi kuitenkin luokitella viestit hienojakoisemminkin. Sankojen määrää ei ole rajoitettu. Voit käyttää esimerkiksi sankoja "roskapostit", "yksityiset" ja "työasiat". Help_No_More Älä näytä tätä viestiä enää popfile-1.1.3+dfsg/languages/Slovak.msg0000664000175000017500000004466211624177330017302 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Translation Martin Minka (support@k2s.sk) # Identify the language and character set used for the interface LanguageCode sk LanguageCharset windows-1250 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply Pou枴 On Zapnut Off Vypnut TurnOn Zapn TurnOff Vypn Add Prida Remove Odstr疣i Previous Predch疆zajci Next Nasledujci From Odosielateセ Subject Subjekt Classification Klasifik當ia Reclassify Preklasifikovanie Undo Vr疸i Close Zatvori Find N疔s Filter Filter Yes チno No Nie ChangeToYes Zmeni na チno ChangeToNo Zmeni na Nie Bucket K Magnet Magnet Delete Zmaza Create Vytvori To Prjemca Total Celkom Rename Premenova Frequency Frekvencia Probability Pravdepodobnos Score Hodnotenie Lookup Hセadanie # The header and footer that appear on every UI page Header_Title POPFile riadiaci panel Header_Shutdown Zastavi POPFile Header_History Histria Header_Buckets Ko啼 Header_Configuration Konfigur當ia Header_Advanced Roz夬ren Header_Security Bezpe鈩os Header_Magnets Magnety Footer_HomePage POPFile domovsk str疣ka Footer_Manual Manu疝 Footer_Forums Diskusie Footer_FeedMe Podpori Footer_RequestFeature Po枴adavka na funkcionalitu Footer_MailingList Po嗾ov skupina Configuration_Error1 Znak oddelova鐶 mus by len jeden znak Configuration_Error2 Port u橲vateセsk馼o rozhrania mus by v rozp舩 竟sel 1 a 65535 Configuration_Error3 Port pre POP3 mus by v rozp舩 竟sel 1 a 65535 Configuration_Error4 Veセkos str疣ky mus by v rozp舩 竟sel 1 a 1000 Configuration_Error5 Po鐺t dn v histrii mus by v rozp舩 竟sel 1 a 366 Configuration_Error6 Hodnota 鐶kania na TCP mus by v rozp舩 竟sel 10 a 1800 Configuration_POP3Port Port pre POP3 Configuration_POP3Update Port zmenen na %s; this change will not take affect until you restart POPFile Configuration_Separator Znak oddelova鐶 Configuration_SepUpdate Oddelova zmenen na %s Configuration_UI Port u橲vateセsk馼o rozhrania Configuration_UIUpdate Port u橲vateセsk馼o rozhrania zmenen na %s; this change will not take affect until you restart POPFile Configuration_History Po鐺t spr疱 na str疣ku Configuration_HistoryUpdate Zmenen po鐺t spr疱 na str疣ku na %s Configuration_Days Po鐺t dn uchovania histrie Configuration_DaysUpdate Zmenen po鐺t dn uchovania histrie na %s Configuration_UserInterface U橲vateセsk rozhranie Configuration_Skins Vzhセad Configuration_SkinsChoose Zvol vzhセad Configuration_Language Jazyk Configuration_LanguageChoose Zvol jazyk Configuration_ListenPorts Porty Configuration_HistoryView Zobrazenie histrie Configuration_TCPTimeout ネakanie na pripojenie TCP Configuration_TCPTimeoutSecs ネakanie na pripojenie TCP v sekund當h Configuration_TCPTimeoutUpdate ネakanie na pripojenie TCP zmenen na %s Configuration_ClassificationInsertion Vkladanie textov do spr疱y Configuration_SubjectLine Zmena textu subjektu Configuration_XTCInsertion Pridanie hlavi鑢y X-Text-Classification Configuration_XPLInsertion Pridanie hlavi鑢y X-POPFile-Link Configuration_Logging Protokol spracovania Configuration_None 司adny Configuration_ToScreen Na obrazovku Configuration_ToFile Do sboru Configuration_ToScreenFile Na obrazovku a do sboru Configuration_LoggerOutput Vstup protokolu Configuration_GeneralSkins Vzhセad Configuration_SmallSkins Mal vzhセad Configuration_TinySkins Drobn vzhセad Advanced_Error1 '%s' sa u nach疆za v zozname Ignorovan slov Advanced_Error2 Ignorovan slov m柆 obsahova len: alfanumerick znaky, ., _, -, @ Advanced_Error3 '%s' pridan do zoznamu Ignorovan slov Advanced_Error4 '%s' sa nenach疆za v zozname Ignorovan slov Advanced_Error5 '%s' odstr疣en zo zoznamu Ignorovan slov Advanced_StopWords Ignorovan slov Advanced_Message1 POPFile ignoruje nasledovn, 鐶sto pou橲van slov: Advanced_AddWord Prida slovo Advanced_RemoveWord Odstr疣i slovo History_Filter  (zobrazuje sa len k %s) History_FilterBy Filtrova podセa History_Search  (vyhセadan podセa odosielateセa/subjektu %s) History_Title Posledn spr疱y History_Jump Prejdi na spr疱u History_ShowAll Zobraz v啼tky History_ShouldBe M by History_NoFrom prazdny riadok odosielateセa History_NoSubject prazdny riadok subjektu History_ClassifyAs Klasifikuj ako History_MagnetUsed Pou枴t magnet History_ChangedTo Zme na %s History_Already U reklasifikovan na %s History_RemoveAll Odstr碪 v啼tko History_RemovePage Odst碪 stranu History_Remove Ak chce zmaza z痙namy z histrie, klikni History_SearchMessage Hセadaj odosielateセa/subjekt History_NoMessages 司adne spr疱y History_ShowMagnet zmagnetizovan History_Magnet  (zobrazuj sa len z痙namy klasifikovan magnetom) History_ResetSearch Vypr痙dni Password_Title Heslo Password_Enter Zadaj heslo Password_Go Vstp! Password_Error1 Nespr疱ne heslo Security_Error1 Bezpe鈩ostn port mus by v rozp舩 竟sel 1 a 65535 Security_Stealth Utajen md/ネinnos servera Security_NoStealthMode Nie (Utajen md) Security_ExplainStats (Ak je toto zapnut, POPFile po嗟e raz za de nasledovn tri hodnoty na str疣ku getpopfile.org: bc (celkov po鐺t ko嗤v, ktor m癩), mc (celkov po鐺t spr疱, ktor POPFile klasifikoval) a ec (celkov po鐺t chybnch klasifik當ii). Tieto hodnoty sa ukladaj do sboru a bud pou枴t na vyhodnotenie niektorch 嗾atistk o tom ako セudia pou橲vaj POPFile a ako dobre funguje. Mj web server uchov疱a tieto inform當ie pribli柤e 5 dn a potom ich zma枡; Neuchov疱am inform當ie prepojujce 嗾atistick daje s konkr騁nymi IP adresami.) Security_ExplainUpdate (Ak je toto zapnut, POPFile po嗟e raz za de nasledovn tri hodnoty na str疣ku getpopfile.org: ma (hlavn 竟slo verzie pou橲van馼o POPFile), mi (vedセaj喨e 竟slo verzie pou橲van馼o POPFile) a bn (竟slo kompil當ie pou橲van馼o POPFile). POPFile dostane odpove vo forme obr痙ku, ktor sa zobraz na vrchu str疣ku, ak je k dispozcii nov verzia. Mj web server uchov疱a tieto inform當ie pribli柤e 5 dn a potom ich zma枡; Neuchov疱am inform當ie prepojujce 嗾atistick daje s konkr騁nymi IP adresami.) Security_PasswordTitle Heslo u橲vateセsk馼o rozhrania Security_Password Heslo Security_PasswordUpdate Heslo zmenen na %s Security_AUTHTitle Bezpe鈩 overovanie hesla/AUTH Security_SecureServer Bezpe鈩ostn server Security_SecureServerUpdate Bezpe鈩ostn server zmenen na %s; t疸o zmena vstpi do platnosti a po re嗾arte POPFile Security_SecurePort Bezpe鈩ostn port Security_SecurePortUpdate Port zmenen na %s; t疸o zmena vstpi do platnosti a po re嗾arte POPFile Security_POP3 Povoセ POP3 pripojenia zo vzdialench po竟ta鑰v (vy杪duje re嗾art POPFile) Security_UI Povoセ HTTP (u橲vateセsk rozhranie) pripojenia zo vzdialench po竟ta鑰v (vy杪duje re嗾art POPFile) Security_UpdateTitle Automatick kontrola novch verzi Security_Update Kontroluj denne nov verzie programu POPFile Security_StatsTitle Oznamova 嗾atistiky Security_Stats Posiela 嗾atistiky denne Magnet_Error1 Magnet '%s' u existuje v ko喨 '%s' Magnet_Error2 Nov magnet '%s' by sa bil s existujcim magnetom '%s' v ko喨 '%s' a mohol by spsobova dvojzmyseln vsledky. Nov magnet nebol pridan. Magnet_Error3 Vytvoren nov magnet '%s' v ko喨 '%s' Magnet_CurrentMagnets Aktu疝ne magnety Magnet_Message1 Nasledovn magnety klasifikuj po嗾u v枦y do ur鐺n馼o ko啾. Magnet_CreateNew Vytvori nov magnet Magnet_Explanation Existuj tri typy magnetov:

  • Adresa alebo meno odosiela抛セa: (pol鑢o From: v po嗾e) Napr.: john@company.com pre konkr騁nu adresu,
    company.com pre ka枦馼o odosielateセa z adresy company.com,
    John Doe pre konkr騁nu osobu, John pre ka枦n馼o Johna
  • Adresa alebo meno prjemcu: To ist ako predch疆zajce, ale pre pol鑢o To: po嗾y
  • Slov v subjekte: Napr.: hello zarad ka枦 po嗾u, ktor m hello v subjekte
Magnet_MagnetType Typ magnetu Magnet_Value Hodnota Magnet_Always Zarad sa v枦y do ko啾 Bucket_Error1 N痙vy ko嗤v m柆 obsahova len znaky od a do z (mal psmo) plus - a _ Bucket_Error2 K s n痙vom %s u existuje Bucket_Error3 Vytvoren k s n痙vom %s Bucket_Error4 Prosm, nezad疱aj pr痙dne n痙vy Bucket_Error5 K je premenovan z %s na %s Bucket_Error6 Zmazan k %s Bucket_Title Prehセad Bucket_BucketName N痙ov ko啾 Bucket_WordCount Po鐺t slov Bucket_WordCounts Po鑼y slov Bucket_UniqueWords Jedine鈩 slov Bucket_SubjectModification Modifik當ia subjektu Bucket_ChangeColor Zmena farby Bucket_NotEnoughData Nedostatok dajov Bucket_ClassificationAccuracy Presnos klasifik當ie Bucket_EmailsClassified Klasifikovan po嗾a Bucket_EmailsClassifiedUpper Klasifikovan po嗾a Bucket_ClassificationErrors Chyby klasifik當ie Bucket_Accuracy Presnos Bucket_ClassificationCount Po鑼y klasifik當ie Bucket_ResetStatistics Vynulovanie 嗾atistiky Bucket_LastReset Posledn vynulovanie Bucket_CurrentColor aktu疝na farba %s je %s Bucket_SetColorTo Nastav farbu %s na %s Bucket_Maintenance レdr枌a Bucket_CreateBucket Vytvor k s n痙vom Bucket_DeleteBucket Zma k s n痙vom Bucket_RenameBucket Premenuj k s n痙vom Bucket_Lookup Vyhセadanie Bucket_LookupMessage Vyhセadaj slovo v ko嗤ch Bucket_LookupMessage2 Vsledok hセadania pre Bucket_LookupMostLikely %s sa naj鐶stej喨e nach疆za v ko喨 %s Bucket_DoesNotAppear

%s sa nenach疆za v ani jednom ko喨 Bucket_DisabledGlobally Glob疝ne vypnut Bucket_To na Bucket_Quarantine Karant駭a SingleBucket_Title Detail pre %s SingleBucket_WordCount Po鐺t slov v ko喨 SingleBucket_TotalWordCount Celkov po鐺t slov SingleBucket_Percentage Percento z celku SingleBucket_WordTable Tabuセka slov pre %s SingleBucket_Message1 Slov ozna鐺n s (*) boli pou枴t na klasifik當iu po鐶s aktu疝neho spustenia POPFile. Klikni na ktor駝oセvek slovo, ak chce vidie jeho vskyt vo v啼tkch ko嗤ch. SingleBucket_Unique %s jedine鈩ch Session_Title POPFile session has expired Session_Error Your POPFile session has expired. Mohlo to nasta vypnutm a zapnutm POPFile, pri鑰m ste nechali otvoren web browser. Prosm, ak chcete pokra鑰va v pr當i s POPFile, kliknite na niektor z vrchnch liniek. Header_MenuSummary T疸o tabuセka je naviga鈩 menu, ktor sprstupuje v啼tky ostatn str疣ky riadiaceho panelu. History_MainTableSummary T疸o tabuセka zobrazuje odosielateセov a subjekty aktu疝ne prijatch spr疱 a umo柤uje ich prezera a klasifikova. Kliknutm na text subjektu sa zobraz znenie spr疱y, spolu s inform當iou pre鑰 bola klasifikovan tak, ako bola. St蚪ec 'M by' umo橙uje ur鑛, do ktor馼o ko啾 spr疱a patr, alebo zru喨 takto zmenu. St蚪ec 'Odstr疣i' ti umo橙uje zmaza dan spr疱u z histrie, ak ju viac nepotrebuje. History_OpenMessageSummary T疸o tabuセka obsahuje cel text spr疱y, spolu so zvraznenmi slovami, ktor boli pou枴t pri klasifik當ii do dan馼o ko啾. Bucket_MainTableSummary T疸o tabuセka obsahuje prehセad klasifika鈩ch ko嗤v. Ka枦 riadok zobrazuje n痙ov ko啾, celkov po鐺t slov v tomto ko喨, aktu疝ny po鐺t individu疝nych slov v ka枦om ko喨, 鑛 bude text subjektu spr疱y zmenen ak bude spr疱a klasifikovan, 鑛 zaradi spr疱y v tomto ko喨 do karant駭y a tabuセku, kde sa d vybra farba ktoru sa bude zobrazova v啼tko na riadiacom panely, tkajce sa tohto ko啾. Bucket_StatisticsTableSummary T疸o tabuセka ponka tri 嗾atistick prehセady o vkone POPFile. Prv zobrazuje presnos klasifik當ie, druh koセko spr疱 bolo klasifikovanch a do ktorch ko嗤v a tret zobrazuje koセko slov obsahuje ktor k a ak je ich relatvne percentu疝ne zastpenie. Bucket_MaintenanceTableSummary T疸o tabuセka obsahuje formul疵e, ktor ti umo柤uj vytvori, zmaza alebo premenova ko啼 a vyhセada zastpenie slova vo v啼tkch ko嗤ch a jeho relatvne zastpenie. Bucket_AccuracyChartSummary T疸o tabuセka graficky zobrazuje presnos klasifik當ie spr疱. Bucket_BarChartSummary T疸o tabuセka graficky zobrazuje percentu疝ne zaplnenie jednotlivch ko嗤v. Je pou枴t z疵ove pre po鐺t klasifikovanch spr疱 a celkov po鐺t slov. Bucket_LookupResultsSummary T疸o tabuセka zobrazuje pravdepodobnos priraden k jednotlivm slov疥 v korpuse. Pre ka枦 k zobrazuje frekvenciu vskytu slova, pravdepodobnos s akou sa vyskytuje v ko喨 a celkov vplyv slova na zaradenie spr疱y do ko啾 ak sa v nej dan slovo vyskytuje. Bucket_WordListTableSummary T疸o tabuセka zobrazuje zoznam v啼tkch slov pre k, slov s zoraden podセa za鑛ato鈩ch znakov po riadkoch. Magnet_MainTableSummary T疸o tabuセka zobrazuje zoznam magnetov, ktor s pou橲van na automatick klasifikovanie spr疱 podセa presnch pravidiel. Ka枦 riadok zobrazuje ako je magnet definovan, pre ktor k sl枴 a tla鑛dlo na zmazanie magnetu. Configuration_MainTableSummary T疸o tabuセka obsahuje formul疵e ktor ti umo橙uj konfigurova POPFile. Configuration_InsertionTableSummary T疸o tabuセka obsahuje tla鑛dl, ktor ur鑾j 鑛 sa maj alebo nemaj vykona niektor zmeny v z疉lav alebo texte subjektu spr疱y skr, ako sa posunie k po嗾ov駑u klientovi. Security_MainTableSummary T疸o tabuセka poskytuje niekoセko nastaven, ktor ovplyvuj bezpe鈩os celkovej konfigur當ie POPFile, 鑛 sa m vykon疱a automatick kontrola existencie zmien programu a 鑛 sa m zasiela 嗾atistika spracovania do centr疝nej datab痙y autora programu. Advanced_MainTableSummary T疸o tabuセka zobrazuje zoznam slov, ktor POPFile ignoruje pri klasifikovan spr疱 z dvodu ich relatvne 鐶st馼o vskytu vo v啼obecnch spr疱ach. S zobrazen v riadkoch v z疱islosti od prv馼o znaku. popfile-1.1.3+dfsg/languages/Russian.msg0000664000175000017500000004650511624177330017465 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # メノ ミナメナラマトナ ホチ メユモモヒノハ ムレルヒ ラモミフルフノ モチヘルナ メチレホルナ マロノツヒノ ノ ホナトマ゙」ヤル # モチヘマヌマ ラナツ-ノホヤナメニナハモチ -- モフノロヒマヘ ヘホマヌマナ ホチヘナメヤラマ レチロノヤマ ラ ヒマト. # 衲フノ ム ノ トチフリロナ ツユトユ ミマフリレマラチヤリモム POPFile, ム ミマモヤチメチタモリ ホチハヤノ ラメナヘム # マヤトナフノヤリ ノホヤナメニナハモ マヤ ヒマトチ, ノ チトチミヤノメマラチヤリ ノホヤナメニナハモ ヒ メユモモヒマヘユ # ムレルヒユ. # # メナトフマヨナホノム ノ レチヘナ゙チホノム モ ツフチヌマトチメホマモヤリタ ミメノホノヘチタヤモム ミマ ワフナヒヤメマホホマハ # ミマ゙ヤナ: alexander saltanov # Identify the language and character set used for the interface LanguageCode ru LanguageCharset koi8-r LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply チミマヘホノヤリ On ヒフ. Off ルヒフ. TurnOn ヒフダノヤリ TurnOff ルヒフダノヤリ Add 蔆ツチラノヤリ Remove トチフノヤリ Previous メナトルトユンノハ Next フナトユタンノハ From ヤミメチラノヤナフリ Subject ナヘチ Classification フチモモノニノヒチテノム Reclassify ナメナヒフチモモノニノテノメマラチヤリ Undo ヤヘナホノヤリ Close チヒメルヤリ Find チハヤノ Filter ルツメチヤリ Yes 菽 No ナヤ ChangeToYes 鰛ヘナホノヤリ ホチ «菽» ChangeToNo 鰛ヘナホノヤリ ホチ «ナヤ» Bucket ナトメマ Magnet チヌホノヤ Delete トチフノヤリ Create マレトチヤリ To マフユ゙チヤナフリ Total モナヌマ Rename ナメナノヘナホマラチヤリ Frequency チモヤマヤチ Probability ナメマムヤホマモヤリ Score ゙」ヤ Lookup 鰌ヒチヤリ # The header and footer that appear on every UI page Header_Title 翡ホヤメ ユミメチラフナホノム POPFile Header_Shutdown ルヒフダノヤリ POPFile Header_History 鰌ヤマメノム Header_Buckets 」トメチ Header_Configuration チモヤメマハヒチ Header_Advanced ヤマミ-モフマラチ Header_Security 簀レマミチモホマモヤリ Header_Magnets チヌホノヤル Footer_HomePage ヤメチホノ゙ヒチ POPFile ラ 鯰ヤナメホナヤナ Footer_Manual ユヒマラマトモヤラマ ミマフリレマラチヤナフム Footer_Forums 賺メユヘル Footer_FeedMe チヒマメヘノヤナ チラヤマメチ! Footer_RequestFeature ユヨホチ ホマラチム ニユホヒテノム? Footer_MailingList ミノモマヒ メチモモルフヒノ Configuration_Error1 チレトナフノヤナフリ トマフヨナホ ツルヤリ マトホノヘ モノヘラマフマヘ Configuration_Error2 マヘナメ ミマメヤチ トフム web-ノホヤナメニナハモチ トマフヨナホ ツルヤリ ゙ノモフマヘ マヤ 1 トマ 65535 Configuration_Error3 マヘナメ ミマメヤチ POP3 トマフヨナホ ツルヤリ ゙ノモフマヘ マヤ 1 トマ 65535 Configuration_Error4 チレヘナメ モヤメチホノテル トマフヨナホ ツルヤリ ゙ノモフマヘ マヤ 1 トマ 1000 Configuration_Error5 ノモフマ トホナハ ノモヤマメノノ トマフヨホマ ツルヤリ ゙ノモフマヘ マヤ 1 トマ 366 Configuration_Error6 ホヂナホノナ ヤチハヘチユヤチ TCP トマフヨホマ ツルヤリ ゙ノモフマヘ マヤ 10 トマ 1800 Configuration_POP3Port フユロチヤリ POP3 ミマメヤ Configuration_POP3Update マヘナメ ミマメヤチ ノレヘナホ」ホ ホチ %s; ノレヘナホナホノム ラモヤユミムヤ ラ モノフユ ミマモフナ ミナメナレチミユモヒチ POPFile Configuration_Separator チレトナフノヤナフリ Configuration_SepUpdate チレトナフノヤナフリ ノレヘナホ」ホ ホチ %s Configuration_UI マメヤ ラナツ-ノホヤナメニナハモチ Configuration_UIUpdate マヘナメ ミマメヤチ ラナツ-ノホヤナメニナハモチ ノレヘナホ」ホ ホチ %s; ノレヘナホナホノム ラモヤユミムヤ ラ モノフユ ミマモフナ ミナメナレチミユモヒチ POPFile Configuration_History ヒマフリヒマ ミノモナヘ ミマヒチレルラチヤリ ホチ マトホマハ モヤメチホノテナ Configuration_HistoryUpdate ナミナメリ ホチ モヤメチホノテナ ツユトナヤ ミマヒチレルラチヤリモム %s ミノモナヘ Configuration_Days ヒマフリヒマ トホナハ ネメチホノヤリ ノモヤマメノタ Configuration_DaysUpdate ナミナメリ ノモヤマメノム ツユトナヤ ネメチホノヤリモム %s トホナハ Configuration_UserInterface ナツ-ノホヤナメニナハモ Configuration_Skins ニマメヘフナホノナ Configuration_SkinsChoose ルツメチヤリ ラチメノチホヤ マニマメヘフナホノム Configuration_Language レルヒ Configuration_LanguageChoose ルツメチヤリ ムレルヒ Configuration_ListenPorts POP3 ミマメヤ Configuration_HistoryView 鰌ヤマメノム Configuration_TCPTimeout チハヘチユヤ TCP-モマナトノホナホノム Configuration_TCPTimeoutSecs チハヘチユヤ TCP-モマナトノホナホノム ラ モナヒユホトチネ Configuration_TCPTimeoutUpdate チハヘチユヤ ノレヘナホ」ホ ホチ %s モナヒユホト Configuration_ClassificationInsertion ユトチ レチミノモルラチヤリ ヒフチモモノニノヒチヤマメ Configuration_SubjectLine チミノモルラチヤリ ヒフチモモノニノヒチヤマメ ラ ヤナヘユ ミノモリヘチ Configuration_XTCInsertion 蔆ツチラフムヤリ ミマフナ X-Text-Classification ラ レチヌマフマラマヒ Configuration_XPLInsertion 蔆ツチラフムヤリ ミマフナ X-POPFile-Link ラ レチヌマフマラマヒ Configuration_Logging マヌノ Configuration_None ノヒユトチ Configuration_ToScreen チ ワヒメチホ Configuration_ToFile ニチハフ Configuration_ToScreenFile チ ワヒメチホ ノ ラ ニチハフ Configuration_LoggerOutput ユトチ ラルラマトノヤリ フマヌ Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Advanced_Error1 '%s' ユヨナ ナモヤリ ラ モミノモヒナ モヤマミ-モフマラ Advanced_Error2 ヤマミ-モフマラマ ヘマヨナヤ モマトナメヨチヤリ ツユヒラル, テノニメル, ノ モノヘラマフル ., _, -, @ Advanced_Error3 フマラマ '%s' トマツチラフナホマ ラ モミノモマヒ モヤマミ-モフマラ Advanced_Error4 '%s' ホナヤ ラ モミノモヒナ モヤマミ-モフマラ Advanced_Error5 フマラマ '%s' ユトチフナホマ ノレ モミノモヒチ モヤマミ-モフマラ Advanced_StopWords ヤマミ-モフマラチ Advanced_Message1 ヤノ モフマラチ ノヌホマメノメユタヤモム ミメノ ヒフチモモノニノヒチテノノ ミノモナヘ, ミマモヒマフリヒユ ラモヤメナ゙チタヤモム マ゙ナホリ ゙チモヤマ. Advanced_AddWord 蔆ツチラノヤリ モフマラマ Advanced_RemoveWord トチフノヤリ モフマラマ History_Filter  (フナヨチンノナ ラ ラナトメナ %s) History_FilterBy Filter By History_Search  (ホチハトナホホルナ ミマ ヤナヘナ «i%s») History_Title マモフナトホノナ マツメチツマヤチホホルナ ミノモリヘチ History_Jump ナメナハヤノ ヒ ミノモリヘユ History_ShowAll マヒチレルラチヤリ ラモ」 History_ShouldBe 蔆フヨホマ ツルヤリ ラ  History_NoFrom ホナ レチトチホ マヤミメチラノヤナフリ History_NoSubject ホナ レチトチホチ ヤナヘチ History_ClassifyAs フチモモノニノテノメマラチヤリ ヒチヒ History_MagnetUsed 鰌ミマフリレマラチフモム ヘチヌホノヤ History_ChangedTo 鰛ヘナホナホマ ホチ %s History_Already ヨナ ミナメナヒフチモモノニノテノメマラチホマ ヒチヒ %s History_RemoveAll トチフノヤリ ラモタ ノモヤマメノタ History_RemovePage トチフノヤリ ワヤユ モヤメチホノテユ History_Remove ヤマツル ユトチフノヤリ レチミノモノ ノレ ノモヤマメノノ ホチヨヘノヤナ History_SearchMessage 鰌ヒチヤリ ラ ミマフナ ナヘチ History_NoMessages ナヤ ミノモナヘ History_ShowMagnet マフリヒマ ミメノヘチヌホノ゙ナホホルナ History_Magnet  (モメナトノ ヒフチモモノニノテノメマラチホホルネ モ ミマヘマンリタ ヘチヌホノヤマラ) Password_Title チメマフリ Password_Enter ヒチヨノヤナ ミチメマフリ Password_Go マハヤノ Password_Error1 チメマフリ マヒチレチフモム ホナミメチラノフリホルヘ Security_Error1 マヘナメ ツナレマミチモホマヌマ ミマメヤチ トマフヨナホ ツルヤリ ゙ノモフマヘ マヤ 1 トマ 65535 Security_Stealth ナヨノヘ ホナラノトノヘマモヤノ/チモヤメマハヒチ モナメラナメチ Security_NoStealthMode ナヤ (メナヨノヘ ホナラノトノヘマモヤノ) Security_ExplainStats (衲フノ ラヒフダナホマ, POPFile メチレ ラ トナホリ ツユトナヤ マヤミメチラフムヤリ モヒメノミヤユ ホチ getpopfile.org ヤメノ ゙ノモフチ: bc (゙ノモフマ ラチロノネ ラ」トナメ), mc (モヒマフリヒマ ミノモナヘ ツルフマ ヒフチモモノニノテノメマラチホマ モ ミマヘマンリタ POPFile) ノ ec (゙ノモフマ マロノツマヒ ヒフチモモノニノヒチテノノ). ヤノ レホヂナホノム モマネメチホムヤモム ラ ニチハフナ ノ チラヤマメ ツユトナヤ ノモミマフリレマラチヤリ ノネ トフム マミユツフノヒマラチホノム モヤチヤノモヤノ゙ナモヒノネ トチホホルネ マ ヤマヘ, ヒチヒ ノモミマフリレユナヤモム POPFile ノ ホチモヒマフリヒマ ネマメマロマ マホ メチツマヤチナヤ. ナツ-モナメラナメ チラヤマメチ ネメチホノヤ フマヌノ ラ ヤナ゙ナホノナ 5 トホナハ, ミマモフナ ゙ナヌマ マホノ ユトチフムタヤモム, チラヤマメ ホナ レチホノヘチナヤモム モマミマモヤチラフナホノナヘ モヤチヤノモヤノヒノ ノ IP-チトメナモマラ ミマフリレマラチヤナフナハ.) Security_ExplainUpdate (衲フノ ラヒフダナホマ, POPFile メチレ ラ トナホリ ツユトナヤ マヤミメチラフムヤリ モヒメノミヤユ ホチ getpopfile.org ヤメノ ゙ノモフチ: ma (モヤチメロノハ ホマヘナメ ラナメモノノ ユモヤチホマラフナホホマヌマ POPFile), mi (ヘフチトロノハ ホマヘナメ ラナメモノノ) ノ bn (ホマヘナメ モツマメヒノ). POPFile ミマフユ゙ノヤ マヤラナヤ マヤ モナメラナメチ ラ ラノトナ ヒチメヤノホヒノ, ヒマヤマメチム ミマムラノヤモム ララナメネユ モヤメチホノテル, ナモフノ トマモヤユミホチ ホマラチム ラナメモノム. ナツ-モナメラナメ チラヤマメチ ネメチホノヤ フマヌノ ラ ヤナ゙ナホノナ 5 トホナハ, ミマモフナ ゙ナヌマ マホノ ユトチフムタヤモム, チラヤマメ ホナ レチホノヘチナヤモム モマミマモヤチラフナホノナヘ レチミメマモマラ マツ マツホマラフナホノノ ノ IP-チトメナモマラ ミマフリレマラチヤナフナハ.) Security_PasswordTitle チメマフリ トフム ラナツ-ノホヤナメニナハモチ Security_Password チメマフリ Security_PasswordUpdate チメマフリ ノレヘナホ」ホ ホチ '%s' Security_AUTHTitle Secure Password Authentication/AUTH Security_SecureServer 簀レマミチモホルハ モナメラナメ Security_SecureServerUpdate 簀レマミチモホルヘ ヤナミナメリ モ゙ノヤチナヤモム モナメラナメ '%s'. 鰛ヘナホナホノナ ラモヤユミノヤ ラ モノフユ ヤマフリヒマ ミマモフナ ミナメナレチミユモヒチ POPFile Security_SecurePort 簀レマミチモホルハ ミマメヤ Security_SecurePortUpdate 簀レマミチモホルヘ ヤナミナメリ モ゙ノヤチナヤモム ミマメヤ %s. 鰛ヘナホナホノナ ラモヤユミノヤ ラ モノフユ ヤマフリヒマ ミマモフナ ミナメナレチミユモヒチ POPFile Security_POP3 チレメナロチヤリ POP3-モマナトノホナホノム モ ユトチフ」ホホルヘノ ヘチロノホチヘノ Security_UI チレメナロチヤリ HTTP-モマナトノホナホノム (ラナツ-ノホヤナメニナハモ) モ ユトチフ」ホホルヘノ ヘチロノホチヘノ Security_UpdateTitle 瞹ヤマヘチヤノ゙ナモヒマナ マツホマラフナホノナ Security_Update 袒ナトホナラホマ ミメマラナメムヤリ, ホナ マツホマラノフモム フノ POPFile Security_StatsTitle ヤチヤノモヤノ゙ナモヒノナ マヤ゙」ヤル Security_Stats 袒ナトホナラホマ マヤミメチラフムヤリ モヤチヤノモヤノヒユ 葷マホユ Magnet_Error1 チヌホノヤ '%s' ユヨナ モユンナモヤラユナヤ ラ ラナトメナ '%s' Magnet_Error2 マラルハ ヘチヌホノヤ '%s' モマラミチトチナヤ モ ヘチヌホノヤマヘ '%s' ラ ラナトメナ '%s' ノ ヘマヨナヤ モミメマラマテノメマラチヤリ トラユモヘルモフナホホルナ メナレユフリヤチヤル. マラルハ ヘチヌホノヤ ホナ ツルフ トマツチラフナホ. Magnet_Error3 マレトチホ ホマラルハ ヘチヌホノヤ '%s' ラ ラナトメナ '%s' Magnet_CurrentMagnets ユンナモヤラユタンノナ ヘチヌホノヤル Magnet_Message1 チヌホノヤル ミマレラマフムタヤ モヒフチトルラチヤリ ラモナ ミマトネマトムンノナ ヒ ホノヘ モママツンナホノム ラ ユヒチレチホホルナ ラナトメチ. Magnet_CreateNew マレトチヤリ ホマラルハ ヘチヌホノヤ Magnet_Explanation ユンナモヤラユナヤ ヤメノ ヤノミチ ヘチヌホノヤマラ:

  • 眛メナモ ノフノ ノヘム マヤミメチラノヤナフム: ホチミメノヘナメ, "john@company.com" モメチツマヤチナヤ トフム ミノモナヘ, ミメノロナトロノネ モ ユヒチレチホホマヌマ チトメナモチ,
    "company.com" モメチツマヤチナヤ トフム フタツルネ ミノモナヘ, ミメノロナトロノネ ノレ company.com,
    "John Doe" モメチツマヤチナヤ ナモフノ ラ ミマフナ "ヤミメチラノヤナフリ" ミメノモユヤモヤラユナヤ ユヒチレチホホマナ ノヘム, ラ ヤマ ラメナヘム ヒチヒ, "John" モメチツマヤチナヤ トフム フタツルネ 葷マホマラ, ホチミノモチラロノネ ラチヘ ミノモリヘマ
  • 眛メナモ ノフノ ノヘム ミマフユ゙チヤナフム: メチツマヤチナヤ ヒチヒ ミメナトルトユンノハ, ヤマフリヒマ マミナメノメユナヤ ミマフナヘ "マフユ゙チヤナフリ"
  • フマラチ ラ ヤナヘナ ミノモリヘチ: ホチミメノヘナメ, "hello" モメチツマヤチナヤ ホチ ラモナネ ミノモリヘチネ モ ワヤノヘ ミメノラナヤモヤラノナヘ ラ ヤナヘナ
Magnet_MagnetType ノミ ヘチヌホノヤチ Magnet_Value ホヂナホノナ Magnet_Always モナヌトチ モヒフチトルラチヤリ ラ ラナトメマ Bucket_Error1 チレラチホノナ ラナトメチ ヘマヨナヤ モマモヤマムヤリ ノレ モヤメマ゙ホルネフチヤノホモヒノネ ツユヒラ マヤ 'a' トマ 'z' ノ レホチヒマラ - ノ _ Bucket_Error2 ナトメマ '%s' ユヨナ モユンナモヤラユナヤ Bucket_Error3 マレトチホマ ラナトメマ '%s' Bucket_Error4 Please enter a non-blank word Bucket_Error5 ナトメマ '%s' ミナメナノヘナホマラチホマ ラ '%s' Bucket_Error6 トチフナホマ ラナトメマ '%s' Bucket_Title ヤ゙」ヤ Bucket_BucketName チレラチホノナ ラナトメチ Bucket_WordCount マフノ゙ナモヤラマ モフマラ Bucket_WordCounts フマラチ Bucket_UniqueWords ホノヒチフリホルネ モフマラ Bucket_SubjectModification 鰛ヘナホナホノナ ヤナヘル ミノモリヘチ Bucket_ChangeColor 鰛ヘナホノヤリ テラナヤ Bucket_NotEnoughData ナトマモヤチヤマ゙ホマ トチホホルネ Bucket_ClassificationAccuracy マ゙ホマモヤリ ヒフチモモノニノヒチテノノ Bucket_EmailsClassified フチモモノニノテノメマラチホホルナ ミノモリヘチ Bucket_EmailsClassifiedUpper フチモモノニノテノメマラチホホルナ ミノモリヘチ Bucket_ClassificationErrors ロノツヒノ ヒフチモモノニノヒチテノノ Bucket_Accuracy マ゙ホマモヤリ Bucket_ClassificationCount フチモモノニノテノメマラチホマ Bucket_ResetStatistics ツメマモ モヤチヤノモヤノヒノ Bucket_LastReset マモフナトホノハ モツメマモ ツルフ Bucket_CurrentColor %s ヤナヒユンノハ テラナヤ — %s Bucket_SetColorTo モヤチホマラノヤリ %s テラナヤ ラ %s Bucket_Maintenance ミメチラフナホノナ Bucket_CreateBucket マレトチヤリ ラナトメマ Bucket_DeleteBucket トチフノヤリ ラナトメマ Bucket_RenameBucket ナメナノヘナホマラチヤリ ラナトメマ Bucket_Lookup マノモヒ Bucket_LookupMessage 鰌ヒチヤリ モフマラマ ラ ラ」トメチネ Bucket_LookupMessage2 ナレユフリヤチヤル ミマノモヒチ Bucket_LookupMostLikely %s ゙チンナ ラモナヌマ ラモヤメナ゙チナヤモム ラ %s Bucket_DoesNotAppear

%s ホナ ラモヤメナ゙チナヤモム ホノ ラ マトホマヘ ノレ ラ」トナメ Bucket_DisabledGlobally ルヒフダナホマ ヌフマツチフリホマ Bucket_To ラ Bucket_Quarantine チメチホヤノホ SingleBucket_Title マトメマツホナナ マ %s SingleBucket_WordCount フマラ ラ ラナトメナ SingleBucket_TotalWordCount フマラ ラママツンナ SingleBucket_Percentage メマテナホヤマラ マヤ ラモナヌマ SingleBucket_WordTable チツフノテチ モフマラ トフム %s SingleBucket_Message1 フマラチ モマ レラ」レトマ゙ヒマハ (*) ツルフノ ノモミマフリレマラチホル ミメノ ヒフチモモノニノヒチテノノ ラ ワヤマハ モナモモノノ POPFile. 」フヒホノヤナ ヘルロヒマハ ホチ フタツマヘ モフマラナ, ノ ラル ユラノトノヤナ ナヌマ ラナメマムヤホマモヤリ トフム ラモナネ ラ」トナメ. SingleBucket_Unique %s ユホノヒチフリホマ Session_Title ナモモノム POPFile ユモヤチメナフチ Session_Error チロチ モナモモノム POPFile ユモヤチメナフチ. ツル゙ホマ ヤチヒマナ モフユ゙チナヤモム, ナモフノ ナモフノ マモヤチホマラノヤリ ノ モホマラチ レチミユモヤノヤ POPFile, チ ラ ツメマユレナメナ マモヤチラノヤリ マヤヒメルヤルヘ «翡ホヤメ ユミメチラフナホノム». マヨチフユハモヤチ, ン」フヒホノヤナ ミマ フタツマハ モモルフヒナ モラナメネユ, ゙ヤマツル ミメマトマフヨノヤリ メチツマヤユ モ POPFile. Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of PopFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of PopFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of PopFile, whether it should automatically check for updates to the program, and whether statistics about PopFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that PopFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Portugues.msg0000664000175000017500000005346311624177330020037 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode pt LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage br # Common words that are used on their own all over the interface Apply Aplicar ApplyChanges Aplicar Altera鋏es On Ligado Off Desligado TurnOn Ligar TurnOff Desligar Add Adicionar Remove Remover Previous Anterior Next Seguinte From Originador Subject Assunto Cc Cc Classification Classifica鈬o Reclassify Reclassificar Undo Desfazer Close Fechar Find Procurar Filter Filtrar Yes Sim No N縊 ChangeToYes Alterar para Sim ChangeToNo Alterar para N縊 Bucket Recept當ulo Magnet ヘman Delete Apagar Create Criar To Para Total Total Rename Renomear Frequency Frequ麩cia Probability Probabilidade Score Pontua鈬o Lookup Procurar Refresh Refrescar Word Palavra Update Actualizar Count Ocorr麩cias Scores Classifica鋏es QuickMagnets Criar ヘman View_Title Detalhes da mensagem # The header and footer that appear on every UI page Header_Title Centro de Controle POPFile Header_Shutdown Desligar POPFile Header_History Histrico Header_Buckets Recept當ulos Header_Configuration Configura鈬o Header_Advanced Avan軋do Header_Security Seguran軋 Header_Magnets ヘmans Footer_HomePage POPFile na internet Footer_Manual Manual Footer_Forums Frums Footer_FeedMe Doa鋏es Footer_RequestFeature Pedir uma funcionalidade Footer_MailingList Lista de Email Configuration_Error1 O caracter separador deve ser um nico caracter Configuration_Error2 O porta da interface do utilizador deve ser um nmero entre 1 e 65535 Configuration_Error3 A porta de escuta POP3 deve ser um nmero entre 1 e 65535 Configuration_Error4 O tamanho da p疊ina deve ser um nmero entre 1 e 1000 Configuration_Error5 O nmero de dias no histrico deve ser um nmero entre 1 e 366 Configuration_Error6 O tempo limite TCP deve ser um nmero entre 10 e 1800 Configuration_Error7 A porta de escuta XML RPC deve ser um nmero entre 1 e 65535 Configuration_POP3Port Porta de escuta POP3 Configuration_POP3Update Alterada a porta para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_NNTPPort Porta de escuta NNTP Configuration_NNTPUpdate Alterada a porta NNTP para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_SMTPPort Porta de escuta SMTP Configuration_SMTPUpdate Alterada a porta SMTP para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_XMLRPCPort Porta de escuta XML RPC Configuration_XMLRPCUpdate Alterada a porta XML RPC para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_POP3Separator Caracter separador POP3 (host:port:user) Configuration_NNTPSeparator Caracter separador NNTP (host:port:user) Configuration_POP3SepUpdate Alterado o separador POP3 para %s Configuration_NNTPSepUpdate Alterado o separador NNTP para %s Configuration_UI Porta da interface do utilizador (web) Configuration_UIUpdate Alterada a porta da interface web do utilizador para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_History Nmero de emails por p疊ina Configuration_HistoryUpdate Alterado o nmero de emails por p疊ina para %s Configuration_Days Nmero de dias para manter no histrico Configuration_DaysUpdate Alterado o nmero de dias para manter no histrico para %s Configuration_UserInterface Interface do Utilizador Configuration_Skins Aspecto Configuration_SkinsChoose Escolha o aspecto Configuration_Language Lngua Configuration_LanguageChoose Escolha a lngua Configuration_ListenPorts Portas de Escuta Configuration_HistoryView Exibir Histrico Configuration_TCPTimeout Tempo Limite de Conex縊 TCP Configuration_TCPTimeoutSecs Tempo limite de conex縊 TCP em segundos Configuration_TCPTimeoutUpdate Alterado o tempo limite de conex縊 TCP para %s Configuration_ClassificationInsertion Inser鈬o de Classifica鈬o Configuration_SubjectLine Modifica鈬o do assunto Configuration_XTCInsertion Inser鈬o de X-Text-Classification Configuration_XPLInsertion Inser鈬o de X-POPFile-Link Configuration_Logging Registo de actividade Configuration_None em nenhum lado Configuration_ToScreen no ecr Configuration_ToFile num ficheiro Configuration_ToScreenFile no ecr縅 e num ficheiro Configuration_LoggerOutput Registar actividade Configuration_GeneralSkins Aspecto normal Configuration_SmallSkins Aspecto pequeno Configuration_TinySkins Aspecto minsculo Configuration_CurrentLogFile <registo de actividade actual> Advanced_Error1 '%s' j est na lista de palavras ignoradas Advanced_Error2 Palavras ignoradas podem somente conter caracteres alfanum駻icos, ., _, -, ou @ Advanced_Error3 '%s' adicionado na lista de palavras ignoradas Advanced_Error4 '%s' n縊 est na lista de palavras ignoradas Advanced_Error5 '%s' removido da lista de palavras ignoradas Advanced_StopWords Palavras Ignoradas Advanced_Message1 As seguintes palavras s縊 ignoradas de todas as classifica鋏es porque ocorrem muito frequentemente. Advanced_AddWord Adicionar palavra Advanced_RemoveWord Remover palavra History_Filter  (apenas mostrando o recept當ulo %s) History_FilterBy Filtrar por History_ResetSearch Mostar todos History_Search  (procurar pelo assunto %s) History_Title Mensagens Recentes History_Jump Ir para a mensagem History_ShowAll Exibir Tudo History_ShouldBe Deveria ser History_NoFrom sem originador History_NoSubject sem assunto History_ClassifyAs Classificar como History_MagnetUsed ヘman usado History_MagnetBecause ヘman usado

Classificado em %s por causa do man %s

History_ChangedTo Alterado para %s History_Already J reclassificado como %s History_RemoveAll Remover Tudo History_RemovePage Remover esta P疊ina History_Remove Para remover entradas do histrico use History_SearchMessage Procurar Assunto History_NoMessages Nenhuma mensagem History_ShowMagnet Magnetizadas History_ShowNoMagnet N縊 magnetizadas History_Magnet  (mensagens classificadas por man) History_NoMagnet  (mensagens n縊 classificadas por man) Password_Title Senha Password_Enter Digite a senha Password_Go Entrar! Password_Error1 Senha incorreta Security_Error1 A porta segura deve ser um nmero entre 1 e 65535 Security_Stealth Modo Stealth/Opera鈬o Servidor Security_NoStealthMode N縊 (Modo Stealth) Security_ExplainStats (Com isto ligado o POPFile envia uma vez por dia os seguintes tr黌 valores para um script em getpopfile.org: bc (o nmero total de recept當ulos que voc tem), mc (o nmero total de mensagens que o POPFile classificou) e ec (o nmero total de erros de classifica鈬o). Isto fica guardado num arquivo que eu vou usar para publicar algumas estatsticas sobre como as pessoas usam o POPFile e o qu縊 bem ele funciona. O meu servidor web mant駑 o seus arquivos de log por mais ou menos 5 dias antes de os apagar; Eu n縊 guardo nenhuma liga鈬o entre as estatstcas e os endere輟s IP de cada um.) Security_ExplainUpdate (Com isto ligado o POPFile envia uma vez por dia os seguintes tr黌 valores para um script em getpopfile.org: ma (o nmero maior da vers縊 do seu POPFile), mi (o nmero menor da vers縊 do seu POPFile) and bn (o nmero do build da sua vers縊 do POPFile). O POPFile recebe uma resposta na forma de um gr畴ico que aparece no topo da p疊ina se uma nova vers縊 estiver disponvel. Meu servidor web mant駑 seus arquivos de log por mais ou menos 5 antes de os apagar; Eu n縊 guardo nenhuma liga鈬o entre as verifica鋏es de vers縊 e os endere輟s IP de cada um.) Security_PasswordTitle Senha da Interface de utilizador Security_Password Senha Security_PasswordUpdate Alterada a senha para %s Security_AUTHTitle Autentica鈬o Segura de Senha/AUTH Security_SecureServer Servidor Seguro Security_SecureServerUpdate Alterado o servidor seguro para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_SecurePort Porta segura Security_SecurePortUpdate Alterada a porta para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_SMTPServer Servidor SMTP real Security_SMTPServerUpdate Alterado o servidor SMTP real para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_SMTPPort Porta do servidor SMTP real Security_SMTPPortUpdate Alterada a porta do servidor SMTP real para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_POP3 Aceitar conexes POP3 de m痃uinas remotas Security_NNTP Aceitar conexes NNTP de m痃uinas remotas Security_XMLRPC Aceitar conexes XMLRPC de m痃uinas remotas Security_SMTP Aceitar conexes SMTP de m痃uinas remotas Security_UI Aceitar conexes HTTP (Interface de utilizador) de m痃uinas remotas Security_UpdateTitle Verifica鈬o Autom疸ica de Atualiza鋏es Security_Update Verificar diariamente atualiza鋏es para o POPFile Security_StatsTitle Reportar Estatsticas Security_Stats Enviar estatsticas para o John diariamente Magnet_Error1 ヘman '%s' j existe no recept當ulo '%s' Magnet_Error2 O novo man '%s' colide com o man '%s' no recept當ulo '%s' e pode causar resultados ambguos. O novo man n縊 foi adicionado. Magnet_Error3 Criar novo man '%s' no recept當ulo '%s' Magnet_CurrentMagnets ヘmans Actuais Magnet_Message1 Os seguintes mans atraem as mensagens para recept當ulo especificado. Magnet_CreateNew Criar Novo ヘman Magnet_Explanation Tr黌 tipos de man est縊 disponveis:
  • De um endere輟 ou nome: Por exemplo: adriano@companhia.com para apanhar um endere輟 especfico,
    companhia.com para apanhar todo mundo que manda mensagens de companhia.com,
    Adriano Gomes para apanhar uma pessoa especfica, Adriano para apanhar todos os Adrianos
  • Para um endere輟 ou nome: Como um man Originador: mas para o endere輟 Para: de uma mensagem
  • Palavras no assunto: Por exemplo: ol para apanhar todas as mensagens com ol no assunto
Magnet_MagnetType Tipo do man Magnet_Value Valor Magnet_Always Colocar sempre no recept當ulo Magnet_Jump Detalhes do man Bucket_Error1 Nomes de recept當ulos apenas podem conter as letras de a at z minsculas mais - e _ Bucket_Error2 O recept當ulo %s j existe Bucket_Error3 Criado o recept當ulo %s Bucket_Error4 Por favor digite uma palavra que n縊 seja em branco Bucket_Error5 Renomeado o recept當ulo %s para %s Bucket_Error6 Apagado o recept當ulo %s Bucket_Title Sum疵io Bucket_BucketName Nome do recept當ulo Bucket_WordCount Palavras Bucket_WordCounts Distribui鈬o de Palavras Bucket_UniqueWords Palavras レnicas Bucket_SubjectModification Modifica鈬o do Assunto Bucket_ChangeColor Alterar Cor Bucket_NotEnoughData Dados insuficientes Bucket_ClassificationAccuracy Exactid縊 da Classifica鈬o Bucket_EmailsClassified Mensagens classificadas Bucket_EmailsClassifiedUpper Distribui鈬o de Mensagens Bucket_ClassificationErrors Erros de classifica鈬o Bucket_Accuracy Exactid縊 Bucket_ClassificationCount Mensagens Bucket_ClassificationFP Falsos Positivos Bucket_ClassificationFN Falsos Negativos Bucket_ResetStatistics Reiniciar contagem Bucket_LastReset Incio da contagem Bucket_CurrentColor A cr actual do recept當ulo "%s" "%s" Bucket_SetColorTo Alterar a cr do recept當ulo "%s" para "%s" Bucket_Maintenance Manuten鈬o Bucket_CreateBucket Criar um recept當ulo com o nome Bucket_DeleteBucket Apagar o recept當ulo chamado Bucket_RenameBucket Renomear o recept當ulo chamado Bucket_Lookup Procurar Bucket_LookupMessage Procurar por palavra nos recept當ulos Bucket_LookupMessage2 Procurar no resultado por Bucket_LookupMostLikely %s mais prov疱el aparecer em %s Bucket_DoesNotAppear

%s n縊 aparece em nenhum dos recept當ulos Bucket_DisabledGlobally Desligado globalmente Bucket_To para Bucket_Quarantine Quarentena SingleBucket_Title Detalhes do recept當ulo %s SingleBucket_WordCount Contagem de palavras do recept當ulo SingleBucket_TotalWordCount Contagem total de palavras SingleBucket_Percentage Percentagem do total SingleBucket_WordTable Tabela de palavras do recept當ulo %s SingleBucket_Message1 Palavras com asterisco (*) foram usadas para classifica鈬o durante esta sess縊 do POPFile. Clique em qualquer palavra para procurar sua probabilidade para todos os recept當ulos. SingleBucket_Unique %s nicas SingleBucket_ClearBucket Apagar todas as palavras do recept當ulo Session_Title Sess縊 Expirada Session_Error A sua sess縊 POPFile expirou. Isto ocorre quando se reinicia o POPFile com o browser aberto. Por favor clique nos links do topo do ecran para continuar. Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of PopFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of PopFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of PopFile, whether it should automatically check for updates to the program, and whether statistics about PopFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that PopFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Portugues-do-Brasil.msg0000664000175000017500000007213411624177330021645 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # Translated by Adriano Rafael Gomes # Updated by Fernando de Alcantara Correia to v0.19.1 # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode br LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage br # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply Aplicar ApplyChanges Aplicar Altera鋏es On Ligado Off Desligado TurnOn Ligar TurnOff Desligar Add Adicionar Remove Remover Previous Anterior Next Prximo From De Subject Assunto Cc Cc Classification Balde Reclassify Reclassificar Probability Probabilidade Scores Pontos QuickMagnets ヘm縱 R疳idos Undo Desfazer Close Fechar Find Procurar Filter Filtrar Yes Sim No N縊 ChangeToYes Trocar para Sim ChangeToNo Trocar para N縊 Bucket Balde Magnet ヘm Delete Excluir Create Criar To Para Total Total Rename Renomear Frequency Freq麩cia Probability Probabilidade Score Pontua鈬o Lookup Procurar Word Palavra Count Quantidade Update Alterar Refresh Atualizar FAQ FAQ ID ID Date Data Arrived Chegada Size Tamanho # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands . Locale_Decimal , # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title Centro de Controle do POPFile Header_Shutdown Desligar o POPFile Header_History Histrico Header_Buckets Baldes Header_Configuration Configura鈬o Header_Advanced Avan軋do Header_Security Seguran軋 Header_Magnets ヘm縱 Footer_HomePage POPFile Home Page Footer_Manual Manual Footer_Forums Forums Footer_FeedMe Contribua Footer_RequestFeature Pedir uma Caracterstica Footer_MailingList Lista de Email Footer_Wiki Documenta鈬o Configuration_Error1 O caracter separador deve ser um nico caracter Configuration_Error2 O porta da interface de usu疵io deve ser um nmero entre 1 e 65535 Configuration_Error3 A porta de escuta POP3 deve ser um nmero entre 1 e 65535 Configuration_Error4 O tamanho da p疊ina deve ser um nmero entre 1 e 1000 Configuration_Error5 O nmero de dias no histrico deve ser um nmero entre 1 e 366 Configuration_Error6 O tempo limite TCP deve ser um nmero entre 10 e 1800 Configuration_Error7 A porta de escuta XML-RPC deve ser um nmero entre 1 e 65535 Configuration_Error8 A porta do proxy SOCKS V deve ser um nmero entre 1 e 65535 Configuration_POP3Port Porta de escuta POP3 Configuration_POP3Update A porta POP3 foi alterada para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_XMLRPCUpdate A porta XML-RPC foi alterada para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_XMLRPCPort Porta de escuta XML-RPC Configuration_SMTPPort Porta de escuta SMTP Configuration_SMTPUpdate A porta SMTP foi alterada para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_NNTPPort Porta de escuta NNTP Configuration_NNTPUpdate A porta NNTP foi alterada para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_POPFork Permitir conexes POP3 concorrentes Configuration_SMTPFork Permitir conexes SMTP concorrentes Configuration_NNTPFork Permitir conexes NNTP concorrentes Configuration_POP3Separator Caracter de separa鈬o POP3 servidor:porta:usu疵io Configuration_NNTPSeparator Caracter de separa鈬o NNTP servidor:porta:usu疵io Configuration_POP3SepUpdate Separador POP3 alterado para %s Configuration_NNTPSepUpdate Separador NNTP alterado para %s Configuration_UI Porta da interface web de usu疵io Configuration_UIUpdate Alterada a porta da interface web de usu疵io para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Configuration_History Nmero de mensagens por p疊ina Configuration_HistoryUpdate Alterado o nmero de mensagens por p疊ina para %s Configuration_Days Nmero de dias para manter no histrico Configuration_DaysUpdate Alterado o nmero de dias para manter no histrico para %s Configuration_UserInterface Interface de Usu疵io Configuration_Skins Skins Configuration_SkinsChoose Escolha o skin Configuration_Language Linguagem Configuration_LanguageChoose Escolha a linguagem Configuration_ListenPorts Op鋏es de Mdulo Configuration_HistoryView Exibir Histrico Configuration_TCPTimeout Tempo Limite de Conex縊 Configuration_TCPTimeoutSecs Tempo limite de conex縊 em segundos Configuration_TCPTimeoutUpdate Alterado o tempo limite de conex縊 para %s Configuration_ClassificationInsertion Inser鈬o de Texto na Mensagem Configuration_SubjectLine Modifica鈬o de
linha de assunto Configuration_XTCInsertion Cabe軋lho
X-Text-Classification Configuration_XPLInsertion Cabe軋lho
X-POPFile-Link Configuration_Logging Logging Configuration_None Nada Configuration_ToScreen Na Tela (console) Configuration_ToFile Em Arquivo Configuration_ToScreenFile Na Tela e em Arquivo Configuration_LoggerOutput Sada do Logger Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Configuration_CurrentLogFile <Exibir arquivo de log atual> Configuration_SOCKSServer Endere輟 do proxy SOCKS V Configuration_SOCKSPort Porta do proxy SOCKS V Configuration_SOCKSPortUpdate Alterada a porta do proxy SOCKS V para %s Configuration_SOCKSServerUpdate Alterado o endere輟 do proxy SOCKS V para %s Configuration_Fields Colunas do Histrico Advanced_Error1 '%s' j est na lista de Palavras Ignoradas Advanced_Error2 Palavras ignoradas podem somente conter caracteres alfanum駻icos, ., _, -, ou @ Advanced_Error3 '%s' adicionado na lista de Palavras Ignoradas Advanced_Error4 '%s' n縊 est na lista de Palavras Ignoradas Advanced_Error5 '%s' removido da lista de Palavras Ignoradas Advanced_StopWords Palavras Ignoradas Advanced_Message1 O POPFile ignora as seguintes palavras freqentemente usadas: Advanced_AddWord Adicionar palavra Advanced_RemoveWord Remover palavra Advanced_AllParameters Todos os Par穃etros do POPFile Advanced_Parameter Par穃etro Advanced_Value Valor Advanced_Warning Esta a lista completa dos par穃etros do POPFile. Somente para usu疵ios avan軋dos: voc pode alterar qualquer um e clicar em Alterar; n縊 h verifica鈬o de validade. ヘtens em negrito est縊 diferentes da configura鈬o padr縊. Veja OptionReference para mais informa鈬o sobre as op鋏es. Advanced_ConfigFile Arquivo de configura鈬o: History_Filter  (apenas mostrando o balde %s) History_FilterBy Filtrar Por History_Search  (procurado por remetente/assunto %s) History_Title Mensagens Recentes History_Jump Ir para a p疊ina History_ShowAll Exibir Tudo History_ShouldBe Deveria ser History_NoFrom sem linha de History_NoSubject sem linha de assunto History_ClassifyAs Classificar como History_MagnetUsed ヘm usado History_MagnetBecause ヘm Utilizado

Classificado para %s por causa do m %s

History_ChangedTo Alterado para %s History_Already Reclassificado como %s History_RemoveAll Remover Tudo History_RemovePage Remover a P疊ina History_RemoveChecked Remover Marcados History_Remove Para remover entradas do histrico clique History_SearchMessage Procurar Remetente/Assunto History_NoMessages Nenhuma mensagem History_ShowMagnet magnetizado History_Negate_Search Inverter procura/filtro History_Magnet  (mostrando apenas mensagens classificadas por m) History_NoMagnet  (mostrando apenas mensagens n縊 classificadas por m) History_ResetSearch Limpar History_ChangedClass Deveria classificar agora como History_Purge Expirar Agora History_Increase Incrementar History_Decrease Decrementar History_Column_Characters Alterar a largura das colunas De, Para, Cc e Assunto History_Automatic Autom疸ico History_Reclassified Reclassificado History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Senha Password_Enter Digite a senha Password_Go Ir! Password_Error1 Senha incorreta Security_Error1 A porta deve ser um nmero entre 1 e 65535 Security_Stealth Modo Stealth/Opera鈬o Servidor Security_NoStealthMode N縊 (Modo Stealth) Security_StealthMode (Modo Stealth) Security_ExplainStats (Com isto ligado o POPFile envia uma vez por dia os seguintes tr黌 valores para um script em getpopfile.org: bc (o nmero total de baldes que voc tem), mc (o nmero total de mensagens que o POPFile classificou) e ec (o nmero total de erros de classifica鈬o). Isto fica guardado em um arquivo e eu vou usar para publicar algumas estatsticas sobre como as pessoas usam o POPFile e o qu縊 bem ele funciona. Meu servidor web mant駑 seus arquivos de log por mais ou menos 5 dias e ent縊 os deleta; eu n縊 estou guardando nenhuma conex縊 entre as estatstcas e os endere輟s IP de cada um.) Security_ExplainUpdate (Com isto ligado o POPFile envia uma vez por dia os seguintes tr黌 valores para um script em getpopfile.org: ma (o nmero maior da vers縊 do seu POPFile), mi (o nmero menor da vers縊 do seu POPFile) e bn (o nmero do build da sua vers縊 do POPFile). O POPFile recebe uma resposta na forma de um gr畴ico que aparece no topo da p疊ina se uma nova vers縊 estiver disponvel. Meu servidor web mant駑 seus arquivos de log por mais ou menos 5 dias e ent縊 os deleta; eu n縊 estou guardando nenhuma conex縊 entre as verifica鋏es de vers縊 e os endere輟s IP de cada um.) Security_PasswordTitle Senha da Interface de Usu疵io Security_Password Senha Security_PasswordUpdate Alterada a senha Security_AUTHTitle Servidores Remotos Security_SecureServer Servidor POP3 remoto (SPA/AUTH ou proxy transparente) Security_SecureServerUpdate Alterado o servidor POP3 remoto para %s Security_SecurePort Porta POP3 remota (SPA/AUTH ou proxy transparente) Security_SecurePortUpdate Alterada a porta do servidor POP3 remoto para %s Security_SMTPServer Servidor da cadeia SMTP Security_SMTPServerUpdate Alterado o servidor da cadeia SMTP para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_SMTPPort Porta da cadeia SMTP Security_SMTPPortUpdate Alterada a porta da cadeia SMTP para %s; esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Security_POP3 Aceitar conexes POP3 de m痃uinas remotas (requer reiniciar o POPFile) Security_SMTP Aceitar conexes SMTP de m痃uinas remotas (requer reiniciar o POPFile) Security_NNTP Aceitar conexes NNTP de m痃uinas remotas (requer reiniciar o POPFile) Security_UI Aceitar conexes HTTP (Interface de Usu疵io) de m痃uinas remotas (requer reiniciar o POPFile) Security_XMLRPC Aceitar conexes XML-RPC de m痃uinas remotas (requer reiniciar o POPFile) Security_UpdateTitle Verifica鈬o Autom疸ica de Atualiza鈬o Security_Update Verificar diariamente atualiza鋏es para o POPFile Security_StatsTitle Reportar Estatsticas Security_Stats Enviar estatsticas diariamente Magnet_Error1 ヘm '%s' j existe no balde '%s' Magnet_Error2 O novo m '%s' conflita com o m '%s' no balde '%s' e pode causar resultados ambguos. O novo m n縊 foi adicionado. Magnet_Error3 Criar novo m '%s' no balde '%s' Magnet_CurrentMagnets ヘm縱 Atuais Magnet_Message1 Os seguintes m縱 fazem as mensagens serem sempre classificadas no balde especificado. Magnet_CreateNew Criar Novo ヘm Magnet_Explanation Estes tipos de m est縊 disponveis:
  • Endere輟 ou nome do remetente: Por exemplo: fulano@empresa.com para pegar um endere輟 especfico,
    empresa.com para pegar todo mundo que envia de empresa.com,
    Fulano de Tal para pegar uma pessoa especfica, Fulano para pegar todos os Fulanos.
  • Endere輟 ou nome de destinat疵io/cpia: Como um m de remetente mas para o endere輟 Para:/Cc: de uma mensagem.
  • Palavras no assunto: Por exemplo: ol para pegar todas as mensagens com ol no assunto.
Magnet_MagnetType Tipo do m Magnet_Value Valores Magnet_Always Sempre vai para o balde Magnet_Jump Ir para a p疊ina de m縱 Bucket_Error1 Nomes de balde somente podem conter as letras de a at z minsculas, nmeros de 0 a 9, mais - e _ Bucket_Error2 O balde %s j existe Bucket_Error3 Criado o balde %s Bucket_Error4 Por favor digite uma palavra que n縊 seja em branco Bucket_Error5 Renomeado o balde %s para %s Bucket_Error6 Excludo o balde %s Bucket_Title Configura鈬o do Balde Bucket_BucketName Nome do
Balde Bucket_WordCount Contagem de Palavras Bucket_WordCounts Contagens de Palavras Bucket_UniqueWords Palavras Distintas Bucket_SubjectModification Modifica鈬o do
Cabe軋lho Assunto Bucket_ChangeColor Cor do
Balde Bucket_NotEnoughData Dados insuficientes Bucket_ClassificationAccuracy Precis縊 da Classifica鈬o Bucket_EmailsClassified Mensagens classificadas Bucket_EmailsClassifiedUpper Mensagens Classificadas Bucket_ClassificationErrors Erros de classifica鈬o Bucket_Accuracy Precis縊 Bucket_ClassificationCount Contagem da Classifica鈬o Bucket_ClassificationFP Falsos Positivos Bucket_ClassificationFN Falsos Negativos Bucket_ResetStatistics Reiniciar Estatsticas Bucket_LastReset レltimo Reincio Bucket_CurrentColor A cor atual de %s %s Bucket_SetColorTo Ajustar a cor de %s para %s Bucket_Maintenance Manuten鈬o Bucket_CreateBucket Criar balde com o nome Bucket_DeleteBucket Excluir o balde chamado Bucket_RenameBucket Renomear o balde chamado Bucket_Lookup Procurar Bucket_LookupMessage Procurar por palavra nos baldes Bucket_LookupMessage2 Procurar no resultado por Bucket_LookupMostLikely %s mais prov疱el de aparecer em %s Bucket_DoesNotAppear

%s n縊 aparece em nenhum dos baldes Bucket_DisabledGlobally Desabilitado globalmente Bucket_To para Bucket_Quarantine Mensagem de
Quarentena SingleBucket_Title Detalhes para %s SingleBucket_WordCount Contagem de palavras do balde SingleBucket_TotalWordCount Contagem total de palavras SingleBucket_Percentage Percentual do total SingleBucket_WordTable Tabela de Palavras para %s SingleBucket_Message1 Clique em uma letra no ndice para ver a lista de palavras que come軋m com tal letra. Clique em qualquer palavra para procurar sua probabilidade para todos os baldes. SingleBucket_Unique %s distinta SingleBucket_ClearBucket Remover Todas Palavras Session_Title Sess縊 do POPFile Expirada Session_Error A sua sess縊 do POPFile expirou. Isto pode ter sido causado por iniciar e parar o POPFile mas deixando o navegador web aberto. Por favor clique em um dos atalhos acima para continuar a usar o POPFile. View_Title Vis縊 de レnica Mensagem View_ShowFrequencies Exibir freq麩cia das palavras View_ShowProbabilities Exibir probabilidade das palavras View_ShowScores Exibir pontua鈬o das palavras e gr畴ico de decis縊 View_WordMatrix Matriz de palavras View_WordProbabilities exibindo probabilidade das palavras View_WordFrequencies exibindo freq麩cia das palavras View_WordScores exibindo pontua鈬o das palavras View_Chart Gr畴ico de Decis縊 Windows_TrayIcon Exibir o cone do POPFile na bandeja do sistema? Windows_Console Executar o POPFile em uma janela de console? Windows_NextTime

Esta altera鈬o n縊 ter efeito at que voc reinicie o POPFile Header_MenuSummary Esta tabela o menu de navega鈬o que possibilita acesso a cada uma das diferentes p疊inas do centro de controle. History_MainTableSummary Esta tabela mostra o remetente e o assunto das mensagens recebidas recentemente e permite que elas sejam revisadas e reclassificadas. Clicar na linha de assunto vai mostrar o texto inteiro da mensagem, juntamente com informa鈬o sobre por que ela foi classificada como o foi. A coluna 'Deveria ser' permite que voc especifique a que balde a mensagem pertence, ou desfazer esta mudan軋. A coluna 'Remover' permite que voc exclua mensagens especficas do histrico se voc n縊 precisar mais delas. History_OpenMessageSummary Esta tabela cont駑 o texto integral de uma mensagem, com as palavras que s縊 usadas para classifica鈬o destacadas de acordo com o balde que foi mais relevante para elas. Bucket_MainTableSummary Esta tabela fornece uma vis縊 geral dos baldes de classifica鈬o. Cada linha mostra o nome do balde, a contagem total de palavras para aquele balde, o nmero real de palavras individuais em cada balde, se o assunto da mensagem vai ser modificado quando ele for classificado para aquele balde, se as mensagens recebidas naquele balde devem ficar em quarentena, e uma tabela para escolher a cor usada para mostrar qualquer coisa relacionada 瀲uele balde no centro de controle. Bucket_StatisticsTableSummary Esta tabela fornece tr黌 conjuntos de estatsticas sobre o desempenho geral do PopFile. A primeira a exatid縊 da classifica鈬o, a segunda quantas mensagens foram classificadas, e para quais baldes, e a terceira quantas palavras existem em cada balde, e as suas porcentagens relativas. Bucket_MaintenanceTableSummary Esta tabela cont駑 formul疵ios que permitem que voc crie, exclua ou renomeie baldes, e para procurar uma palavra em todos os baldes e ver as suas probabilidades relativas. Bucket_AccuracyChartSummary Esta tabela representa graficamente a exatid縊 da classifica鈬o de mensagens. Bucket_BarChartSummary Esta tabela representa graficamente a uma aloca鈬o porcentual para cada um dos diferentes baldes. Ela usada tanto para o nmero de mensagens classificadas como para o nmero total de palavras. Bucket_LookupResultsSummary Esta tabela mostra as probabilidades associadas com qualquer palavra especfica do corpus. Para cada balde, ela mostra a freq麩cia com que cada palavra ocorre, a probabilidade de que ela ocorra naquele balde, e o efeito geral na pontua鈬o do balde se aquela palavra existir em uma mensagem. Bucket_WordListTableSummary Esta tabela fornece uma rela鈬o de todas as palavras para um balde especfico, organizada pela primeira letra comum para cada linha. Magnet_MainTableSummary Esta tabela mostra a lista de m縱 que s縊 usados para classificar automaticamente mensagens de acordo com regras fixas. Cada linha mostra como o m est definido, para qual balde ele foi concebido, e um bot縊 para excluir aquele m. Configuration_MainTableSummary Esta tabela cont駑 alguns formul疵ios que permitem que voc controle a configura鈬o do PopFile. Configuration_InsertionTableSummary Esta tabela cont駑 botes para determinar se certas modifica鋏es s縊 feitas no cabe軋lho ou no assunto da mensagem antes que ela seja encaminhada para o programa cliente de mensagens. Security_MainTableSummary Esta tabela fornece conjuntos de controles que afetam a seguran軋 da configura鈬o geral do PopFile, se ele deve procurar automaticamente por atualiza鋏es do programa, e se estatsticas sobre o desempenho do PopFile devem ser enviadas ao banco de dados central do autor do programa para informa鈬o geral. Advanced_MainTableSummary Esta tabela fornece uma lista de palavras que o PopFile ignora quando classifica mensagens por causa da sua freq麩cia relativa nas mensagens em geral. Elas s縊 organizadas por linha de acordo com a primeira letra das palavras. Imap_Bucket2Folder Email para o balde '%s' vai para a pasta Imap_MapError Voc n縊 pode mapear mais de um balde para uma nica pasta! Imap_Server Nome do servidor IMAP: Imap_ServerNameError Por favor informe o nome do servidor! Imap_Port Porta do servidor IMAP: Imap_PortError Por favor informe um nmero de porta v疝ido! Imap_Login Conta de login IMAP: Imap_LoginError Por favor informe um nome de usu疵io/login! Imap_Password Senha para a conta IMAP: Imap_PasswordError Por favor informe uma senha para o servidor! Imap_Expunge Expurgar mensagens deletadas de pastas em observa鈬o. Imap_Interval Intervalo de atualiza鈬o em segundos: Imap_IntervalError Por favor informe um intervalo entre 10 e 3600 segundos. Imap_Bytelimit Bytes por mensagem para usar para classifica鈬o. Informe 0 (Nulo) para usar a mensagem completa: Imap_BytelimitError Por favor informe um nmero. Imap_RefreshFolders Atualizar a lista de pastas Imap_Now agora! Imap_UpdateError1 N縊 possvel logar. Verifique seu nome de usu疵io e senha, por favor. Imap_UpdateError2 Falha na conex縊 ao servidor. Por favor verifique o nome e porta do servidor e certifique-se que voc est online. Imap_UpdateError3 Por favor configure os detalhes da conex縊 primeiro. Imap_NoConnectionMessage Por favor configure os detalhes da conex縊 primeiro. Depois disto, mais op鋏es estar縊 disponveis nesta p疊ina. Imap_WatchMore uma pasta para lista de pastas em observa鈬o Imap_WatchedFolder Pasta em observa鈬o nコ Shutdown_Message O POPFile foi desligado Help_Training Quando voc usa o POPFile pela primeira vez, ele ainda n縊 sabe nada e precisa de treinamento. O POPFile requer treinamento nas mensagens para cada balde, e o treinamento acontece quando voc reclassifica para o balde correto uma mensagem que o POPFile classificou incorretamente. Voc deve tamb駑 configurar seu cliente de email para filtrar mensagens baseado na classifica鈬o do POPFile. Informa鈬o para configurar os filtros no seu cliente de email pode ser encontrado no Projeto de Documenta鈬o do POPFile. Help_Bucket_Setup O POPFile requer pelo menos dois baldes al駑 do pseudo-balde "unclassified". O que torna o POPFile nico que ele pode classificar email, mais do que isso, voc pode ter qualquer nmero de baldes. Uma configura鈬o simples poderia ser um balde "spam", "pessoal", e um balde "trabalho". Help_No_More N縊 mostre isto novamente popfile-1.1.3+dfsg/languages/Polish.msg0000664000175000017500000005017611624177330017276 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode pl LanguageCharset ISO-8859-2 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply Zatwierdシ On Wウアczony Off Wyウアczony TurnOn Wウアcz TurnOff Wyウアcz Add Dodaj Remove Usu Previous Poprzedni Next Nast麪ny From Od Subject Temat Cc CC Classification Klasyfikacja Reclassify Klasyfikuj Probability Prawdopodobiestwo Scores Punkty QuickMagnets Szybki Musik Undo Cofnij Close Zamknij Find Znajdシ Filter Filtr Yes Tak No Nie ChangeToYes Zmie na tak ChangeToNo Zmie na nie Bucket Folder Magnet Musik Delete Skasuj Create Utwrz To Do Total Caウkowity Rename Zmie Frequency Cz黌totliwoカ Probability Prawdopodobiestwo Score Punkty Lookup Szukaj Word Sウowo Count Licz Update Aktualizuj Refresh Odカwieソ # The header and footer that appear on every UI page Header_Title Centrum Sterowania POPFile Header_Shutdown Wyウアcz daemona POPFile Header_History Historia Header_Buckets Foldery Header_Configuration Konfiguracja Header_Advanced Zaawansowane Header_Security Bezpieczestwo Header_Magnets Musiki Footer_HomePage Strona gウwna POPFile Footer_Manual Pomoc (angielski) Footer_Forums Forum dyskusyjne Footer_FeedMe Wspomoソenie finansowe Footer_RequestFeature Zgウoカ pomysウ udoskonalenia Footer_MailingList Lista dyskusyjna Configuration_Error1 Separator musi by jednym znakiem Configuration_Error2 Numer portu musi si mieカci mi鹽zy 1 a 65535 Configuration_Error3 Port POP3 musi si zawiera mi鹽zy 1 a 65535 Configuration_Error4 Rozmiar strony musi si zawiera mi鹽zy 1 a 1000 Configuration_Error5 Liczba dni historii musi si zawiera mi鹽zy 1 a 366 Configuration_Error6 TCP timeout musi by mi鹽zy 10 a 1800 Configuration_Error7 Port XML RPC musi by mi鹽zy 1 i 65535 Configuration_POP3Port Port POP3 Configuration_POP3Update Zmieniono port POP3 na %s; ta zmiana zadziaウa dopiero po restarcie POPFile'a. Configuration_XMLRPCUpdate Zmieniono port XML-RPC na %s; ta zmiana zadziaウa dopiero po restarcie POPFile'a Configuration_XMLRPCPort Port XML-RPC Configuration_SMTPPort Port SMTP Configuration_SMTPUpdate Zmieniono port SMTP na %s; ta zmiana zadziaウa dopiero po restarcie POPFile'a Configuration_NNTPPort Port NNTP Configuration_NNTPUpdate Zmieniono port NNTP na %s; ta zmiana zadziaウa dopiero po restarcie POPFile'a Configuration_POP3Separator POP3 serwer:port:uソytkownik separator Configuration_NNTPSeparator NNTP serwer:port:uソytkownik separator Configuration_POP3SepUpdate Zmieniono separator POP3 na %s Configuration_NNTPSepUpdate Zmieniono separator NNTP na %s Configuration_UI Port interface'u WWW Configuration_UIUpdate Zmieniono port interface'u WWW na %s; ta zmiana zadziaウa dopiero po restarcie POPFile'a Configuration_History Liczba wiadomoカci na stron Configuration_HistoryUpdate Zmieniono liczb wiadomoカci na stron na %s Configuration_Days Liczba dni zachowania historii Configuration_DaysUpdate Zmieniono liczb dni zachowania historii na %s Configuration_UserInterface Interface uソytkownika Configuration_Skins Wyglアd Configuration_SkinsChoose Wybierz wyglアd Configuration_Language J黝yk Configuration_LanguageChoose Wybierz j黝yk Configuration_ListenPorts Opcje moduウu Configuration_HistoryView Widok historii Configuration_TCPTimeout Timeout poウアczenia Configuration_TCPTimeoutSecs Timeout poウアczenia w sekundach Configuration_TCPTimeoutUpdate Zmieniono timeout poウアczenia na %s Configuration_ClassificationInsertion Modyfikacja nagウwkw Configuration_SubjectLine Modyfikacja tematu wiadomoカci Configuration_XTCInsertion Nagウwek X-Text-Classification Configuration_XPLInsertion Nagウwek X-POPFile-Link Configuration_Logging Rejestracja czynnoカci Configuration_None Brak Configuration_ToScreen Ekran Configuration_ToFile Plik Configuration_ToScreenFile Ekran i plik Configuration_LoggerOutput Rejestracja do: Configuration_GeneralSkins Wyglアd Configuration_SmallSkins Maウe Configuration_TinySkins Bardzo maウe Configuration_CurrentLogFile <aktualny plik rejestru> Advanced_Error1 '%s' jest juソ na liカcie ignorowanych sウw Advanced_Error2 Sウowa ignorowane mogア zawiera znaki alfanumeryczne, ., _, -, lub @ Advanced_Error3 Sウowo '%s' dodane do listy ignorowanych sウw Advanced_Error4 '%s' nie jest na liカcie ignorowanych sウw Advanced_Error5 Sウowo '%s' usuni黎e z listy ignorowanych sウw Advanced_StopWords Ignorowane sウowa Advanced_Message1 POPFile ignoruje nast麪ujアce cz黌to wystepujアce sウowa: Advanced_AddWord Dodaj sウowo Advanced_RemoveWord Usu sウowo History_Filter  (pokazuj folder %s) History_FilterBy Filtruj wedウug History_Search  (wyszukiwanie wg pola Od/Temat %s) History_Title Ostatnie wiadomoカci History_Jump Idシ do wiadomoカci History_ShowAll Pokaシ wszystko History_ShouldBe Powinno by History_NoFrom brak linii Od History_NoSubject brak linii Temat History_ClassifyAs Klasyfikuj jako History_MagnetUsed Uソyto Musik History_MagnetBecause Uソyto Musik

Zaklasyfikowano do %s z powodu musika %s

History_ChangedTo Zmieniono na %s History_Already Juソ przeklasyfikowano jako %s History_RemoveAll Usu wszystkie History_RemovePage Usu stron History_Remove Aby usunア pola ze strony kliknij (nie usuwa bazy sウw): History_SearchMessage Szukaj wg pl Od/Temat History_NoMessages Brak wiadomoカci History_ShowMagnet musikowane History_ShowNoMagnet odmusikowane History_Magnet  (pokazuj wiadomoカci z musikami) History_NoMagnet  (pokazuj wiadomoカci bez musikw) History_ResetSearch Resetuj Password_Title Hasウo Password_Enter Wpisz hasウo Password_Go Dalej! Password_Error1 Zウe hasウo Security_Error1 Port musi by mi鹽zy 1 a 65535 Security_Stealth Operacje w trybie niewidocznym Security_NoStealthMode Nie (tryb niewidoczny) Security_ExplainStats (gdy to jest wウアczone POPFile wysyウa raz dziennie nast麪ujアce trzy wartoカci do skryptu na getpopfile.org: bc (liczba folderw, ktre posiadasz), mc (liczba klasyfikowanych wiadomoカci) i ec (liczba bウ鹽w klasyfikacji). Sア one gromadzone w pliku i wykorzystam je do publikacji o ludziach uソywajアcych POPFile'a i jak on dziaウa. Mj serwer przechowuje dane przez 5 dni a nast麪nie je kasuje; Nie przechowuj ソadnych danych o adresach IP, itp.) Security_ExplainUpdate (gdy to jest wウアczone POPFile wysyウa raz dziennie nast麪ujアce trzy wartoカci do skryptu na getpopfile.org: ma (numer wersji POPFile'a), mi (numer podwersji POPFile'a) i bn (numer kompilacji POPFile'a). POPFile otrzymuje graficznア informacj na gウwnej stronie jeカli pojawi si nowa wersja. Mj serwer przechowuje dane przez 5 dni a nast麪nie je kasuje; Nie przechowuj ソadnych danych o adresach IP, itp.) Security_PasswordTitle Hasウo interface'u uソytkownika Security_Password Hasウo Security_PasswordUpdate Zmieniono hasウo na %s Security_AUTHTitle Zdalne serwery Security_SecureServer Serwer POP3 SPA/AUTH Security_SecureServerUpdate Zmieniono bezpieczny serwer POP3 SPA/AUTH na %s; ta zmiania zadziaウa dopiero po restarcie POPFile'a Security_SecurePort Port POP3 SPA/AUTH Security_SecurePortUpdate Zmieniono port POP3 SPA/AUTH na %s; ta zmiania zadziaウa dopiero po restarcie POPFile'a Security_SMTPServer Serwer SMTP Security_SMTPServerUpdate Zmieniono serwer SMTP na %s; ta zmiania zadziaウa dopiero po restarcie POPFile'a Security_SMTPPort Port SMTP Security_SMTPPortUpdate Zmieniono port SMTP na %s; ta zmiania zadziaウa dopiero po restarcie POPFile'a Security_POP3 Akceptuj poウアczenia POP3 ze zdalnych komputerw (wymaga restartu POPFile'a) Security_SMTP Akceptuj poウアczenia SMTP ze zdalnych komputerw (wymaga restartu POPFile'a) Security_NNTP Akceptuj poウアczenia NNTP ze zdalnych komputerw (wymaga restartu POPFile'a) Security_UI Akceptuj poウアczenia HTTP (Interface uソytkownika) ze zdalnych komputerw (wymaga restartu POPFile'a) Security_XMLRPC Akceptuj poウアczenia XML-RPC ze zdalnych komputerw (wymaga restartu POPFile'a) Security_UpdateTitle Sprawdzanie automatycznej aktualizacji Security_Update Sprawdシ codziennie zmiany w POPFile'u Security_StatsTitle Statystyki Security_Stats Wysyウaj statystyki codziennie Magnet_Error1 Musik '%s' juソ wyst麪uje w folderze '%s' Magnet_Error2 Nowy musik '%s' jest niezgodny z musikiem '%s' w folderze '%s' i moソe spowodowa problemy. Nie dodano nowego musika. Magnet_Error3 Utwrz nowy musik '%s' w folderze '%s' Magnet_CurrentMagnets Aktualne musiki Magnet_Message1 Nast麪ujアce musiki spowodujア klasyfikacj listw zawsze w okreカlonych folderach. Magnet_CreateNew Utwrz nowy musik Magnet_Explanation Nast麪ujアce rodzaje musikw sア dost麪ne:
  • Adres lub nazwa nadawcy: na przykウad: john@company.com dotyczy konkretnego adresu,
    company.com dotyczy wszystkich nadawcw z company.com,
    John Doe dotyczy konkretnej osoby, John dotyczy wszystkich Johnw
  • Adres lub nazwa Do/Cc: Jak w przypadku pola Od, ale dotyczy pl Do:/Cc:
  • Sウowa w temacie: na przykウad: hello dotyczy wszystkich wiadomoカci z hello w temacie
Magnet_MagnetType Rodzaj musika Magnet_Value Wartoカ Magnet_Always Zawsze idzie do folderu Magnet_Jump Idシ do strony musikw Bucket_Error1 Nazwy folderw mogア zawiera tylko maウe litery od a do z, cyfry 0 do 9, oraz - i _ Bucket_Error2 Folder %s juソ istnieje Bucket_Error3 Utworzono folder %s Bucket_Error4 Prosz wpisa wウaカciwe sウowo Bucket_Error5 Zmieniono nazw folderu %s na %s Bucket_Error6 Usuni黎o folder %s Bucket_Title Podsumowanie Bucket_BucketName Nazwa folderu Bucket_WordCount Liczba sウw Bucket_WordCounts Zliczanie sウw Bucket_UniqueWords Unikatowe sウowa Bucket_SubjectModification Modyfikacja tematu wiadomoカci Bucket_ChangeColor Zmie kolor Bucket_NotEnoughData Brak wystarczajアcych danych Bucket_ClassificationAccuracy Poprawnoカ klasyfikacji Bucket_EmailsClassified Wiadomoカci zaklasyfikowane Bucket_EmailsClassifiedUpper Wiadomoカci zaklasyfikowane Bucket_ClassificationErrors Bウ鹽y klasyfikacji Bucket_Accuracy Poprawnoカ Bucket_ClassificationCount Liczba klasyfikacji Bucket_ClassificationFP Bウアd dodania Bucket_ClassificationFN Bウアd niedodania Bucket_ResetStatistics Resetuj Bucket_LastReset Ostatni reset Bucket_CurrentColor %s obecny kolor to %s Bucket_SetColorTo Ustaw kolor %s na %s Bucket_Maintenance Utrzymanie Bucket_CreateBucket Utwrz folder o nazwie Bucket_DeleteBucket Usu folder o nazwie Bucket_RenameBucket Zmie nazw folderu Bucket_Lookup Szukaj Bucket_LookupMessage Szukaj sウowa w folderze Bucket_LookupMessage2 Szukaj dla Bucket_LookupMostLikely List ze sウowem %s prawdopodobnie powinien si znaleシ w %s Bucket_DoesNotAppear

%s nie wystepuje w ソadnym folderze Bucket_DisabledGlobally Zablokowane globalnie Bucket_To do Bucket_Quarantine Kwarantanna SingleBucket_Title Szczegウy dla %s SingleBucket_WordCount Liczba sウw w folderze SingleBucket_TotalWordCount Caウkowita liczba sウw SingleBucket_Percentage Procent caウoカci SingleBucket_WordTable Tabela sウw dla %s SingleBucket_Message1 Kliknij liter w indeksie, aby zobaczy list sウw rozpoczynajアcych si od tej litery. Kliknij na dowolne sウowo, aby zobaczy jego rozkウad prawdopodobiestwa. SingleBucket_Unique Sウowo %s jest unikatowe SingleBucket_ClearBucket Usu wszystkie sウowa Session_Title Sesja POPFile'a zostaウa zakoczona Session_Error Twoja sesja POPFile'a zostaウa zakoczona. Mogウo si to zdarzy w wyniku restartu POPFile'a lub zamkni鹹ia przeglアdarki. Kliknij na jeden z powyソszych linkw. View_Title Widok pojedynczej wiadomoカci Header_MenuSummary Ta tabela pozwala na dost麪 do rソnych elementw centrum sterowania. History_MainTableSummary Ta tabela pokazuje nadawcw i tematy odstatnio odebranych wiadomoカci i pozwala na reklasyfikacj. Klikni鹹ie na temat spowoduje pokazanie caウej wiadomoカci, wraz z informacjア o powodach klasyfikacji. Kolumna 'Powinno by' pozwala na okreカlenie wウaカciwego folderu lub cofni鹹ie operacji. Kolumna 'Usu' pozwala usunア okreカlone wiadomoカci z historii, jeカli ich juソ nie potrzebujesz. History_OpenMessageSummary Ta tabela zawiera peウny tekst wiadomoカci, ze sウowami uソytymi do klasyfikacji podカwietlonymi w kolorze folderu, do ktrego najlepiej pasujア. Bucket_MainTableSummary Ta tabela pokazuje przeglアd folderw klasyfikacyjnych. Kaソdy wiersz pokazuje nazw folderu, liczb sウw w nim zawartych, liczb niepowtarzalnych sウw w folderze, moソliwoカ zmiany tematu wiadomoカci po zaklasyfikowaniu do folderu, opcj kwarantanny oraz tabel kolorw wyカwietlania (do wyboru). Bucket_StatisticsTableSummary Ta tabela przedstawia trzy rodzaje statystyk dziaウania POPFile'a. Pierwsza okreカla poprawnoカ klasyfikacji, druga liczb zaklasyfikowanych wiadomoカci do poszczeglnych folderw, a trzecia liczb sウw w folderach i ich udziaウ w caウej liczbie. Bucket_MaintenanceTableSummary Ta tabela zawiera formularz do tworzenia, zmiany i usuwania folderw oraz wyszukiwania sウw w folderach, a takソe pokazywania rozkウadw prawdopodobiestwa. Bucket_AccuracyChartSummary Ta tabela pokazuje graficznie poprawnoカ klasyfikacji Bucket_BarChartSummary Ta tabela pokazuje graficznie rozkウad procentowy dla kaソdego folderu. Jest wykorzystywana do pokazywania liczby wiadomoカci i liczby sウw. Bucket_LookupResultsSummary Ta tabela pokazuje rozkウad prawdopodobiestwa dla kaソdego sウowa. Dla kaソdego folderu, pokazuje cz黌totliwoカ wyst麪owania sウowa, prawdopodobiestwo wystアpienia w folderze, oraz oglny wpウyw na wynik, jeカli sウowo wystアpi w wiadomoカci. Bucket_WordListTableSummary Ta tabela przedstawia alfabetycznie list sウw w folderach. Magnet_MainTableSummary Ta tabela pokazuje list musikw klasyfikujアcych automatycznie wiadomoカci zgodnie z przyj黎ymi na sztywno zasadami. W kaソdym wierszu znajduje si musik, przypisany folder oraz przycisk do usuni鹹ia musika. Configuration_MainTableSummary Ta tabela zawiera fomularze do konfigurowania POPFile'a. Configuration_InsertionTableSummary Ta tabela zawiera przeウアczniki okreslajアce czy dokonywa zmian w nagウwkach wiadomoカci przy przesyウaniu do programu pocztowego. Security_MainTableSummary Ta tabela zawiera kontrolki ustawiajアce bezpieczestwo POPFile'a, moソliwoカ sprawdzania aktualizacji oraz moソliwoカ wysyウania statystyk o dziaウaniu POPFile'a do centralnego rejestru programu znajdujアcego si na serwerze autora. Advanced_MainTableSummary Ta tabela zawiera list sウw ignorowanych przez POPFile'a w traksie klasyfikacji wiadomoカci z powodu ich cz黌tego wyst麪owania. Sア one zorganizowane wierszami, alfabetycznie.. popfile-1.1.3+dfsg/languages/Norsk.msg0000664000175000017500000004432211624177330017130 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode no LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage no # Common words that are used on their own all over the interface Apply Bruk On P Off Av TurnOn Sl p TurnOff Sl av Add Legg til Remove Fjern Previous Forrige Next Neste From Fra Subject Emne Classification Klassifisering Reclassify Re-klassifisering Undo Angre Close Lukk Find Sk Filter Filtrer Yes Ja No Nei ChangeToYes Skift til Ja ChangeToNo Skift til Nei Bucket Btte Magnet Magnet Delete Slett Create Opprett To Til Total Total Rename Omdp Frequency Frekvens Probability Sannsynlighet Score Resultat Lookup Sk etter # The header and footer that appear on every UI page Header_Title POPFile Kontrollsenter Header_Shutdown Lukk POPFile Header_History Logg Header_Buckets Btter Header_Configuration Konfigurering Header_Advanced Avansert Header_Security Sikkerhet Header_Magnets Magneter Footer_HomePage POPFile Hjemmeside Footer_Manual Manual Footer_Forums Diskusjonsforum Footer_FeedMe Mat meg! Footer_RequestFeature Etterspr funksjoner Footer_MailingList Mailingliste Configuration_Error1 Skilletegnet skal v誡e ett enkelt tegn Configuration_Error2 Brukergrensesnittets port skal v誡e et nummer mellom 1 og 65535 Configuration_Error3 POP3-porten skal v誡e et nummer mellom 1 og 65535 Configuration_Error4 Sidens strrelse skal v誡e mellom 1 og 1000 Configuration_Error5 Antall dager i loggen skal v誡e et tall mellom 1 og 366 Configuration_Error6 TCP-tidsavbrudd skal v誡e et tall mellom 10 og 1800 Configuration_POP3Port POP3-porten Configuration_POP3Update Oppdaterte porten til %s; Denne endringen vil ikke tre i kraft fr POPFile er startet p nytt Configuration_Separator Skilletegn Configuration_SepUpdate Oppdaterte skilletegnet til %s Configuration_UI Brukergrensesnittets web-port Configuration_UIUpdate Oppdaterte Brukergrensesnittets web-port til %s; endringen vil ikke tre i kraft fr POPFile startes p nytt Configuration_History Antall e-post pr. side Configuration_HistoryUpdate Oppdaterte antall e-post pr. side til %s Configuration_Days Antall dager oppfringer i loggen skal beholdes Configuration_DaysUpdate Oppdaterte antall dager oppfringer i loggen skal beholdes til %s Configuration_UserInterface Brukergrensesnittet Configuration_Skins Skins Configuration_SkinsChoose Velg skin Configuration_Language Spr虧 Configuration_LanguageChoose Velg spr虧 Configuration_ListenPorts POP3-porten Configuration_HistoryView Logg-visning Configuration_TCPTimeout TCP-forbindelsens tidsavbrudd Configuration_TCPTimeoutSecs TCP-forbindelsens tidsavbrudd i sekunder Configuration_TCPTimeoutUpdate Oppdaterte TCP-forbindelsens tidsavbrudd til %s Configuration_ClassificationInsertion Klassifikasjonsm蚯er (innsetting) Configuration_SubjectLine Emnelinje-innsetting Configuration_XTCInsertion X-Text-Classification innsetting Configuration_XPLInsertion X-POPFile-Link innsetting Configuration_Logging Logging Configuration_None Ingen Configuration_ToScreen Til Skjerm Configuration_ToFile Til Fil Configuration_ToScreenFile Til Skjerm og Fil Configuration_LoggerOutput Logger output Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Advanced_Error1 '%s' Er allerede i Stoppordlisten Advanced_Error2 Stoppord kan kun inneholde Alfanumeriske tegn, ., _, -, eller @ tegn Advanced_Error3 '%s' er lagt til i stoppordlisten Advanced_Error4 '%s' er ikke i stoppordlisten Advanced_Error5 '%s' er fjernet fra stoppordlisten Advanced_StopWords Stoppord Advanced_Message1 Disse ordene blir ignorert fra all klassifisering fordi de forekommer meget ofte. Advanced_AddWord Legg til ord Advanced_RemoveWord Fjern ord History_Filter  (vis kun btten%s) History_FilterBy Filter By History_Search  (sk emne for %s) History_Title Siste meldinger History_Jump Hopp til melding History_ShowAll Vis alle History_ShouldBe Skulle v誡e History_NoFrom ingen Fra-linje History_NoSubject ingen Emne-linje History_ClassifyAs klassifisert som History_MagnetUsed Magnet brukt History_ChangedTo Endret til %s History_Already Re-klassifisert som %s History_RemoveAll Fjern alle History_RemovePage Fjern side History_Remove For fjerne oppfringer i loggen, klikk History_SearchMessage Sk Emne History_NoMessages Ingen meldinger Password_Title Passord Password_Enter Skriv inn passord Password_Go OK! Password_Error1 Feil passord Security_Error1 Den sikre porten skal v誡e et tall mellom 1 og 65535 Security_Stealth Stealth Mode/Server Operation Security_NoStealthMode Nei (Stealth Mode) Security_ExplainStats (Denne funksjonen sender en gang per dag de etterflgene tre verdiene til et script hos wwwu.sethesource.com: bc (det totale antall btter du har) mc (det totale antall i meldinger som POPFile har klassifisert ) og ec (det totale antall klassifiseringsfeil). Disse blir lageret i en fil og jeg vil bruke disse data til offentligjre statistikk omkring hvordan folk bruker POPFile og hvor godt POPFile virker. Min web-server beholder denne log-filen omtrent 5 dager og blir s slettet; Jeg lagrer ingen forbindelse mellom statistikken og individuelle IP-adresser.) Security_ExplainUpdate (Denne funksjonen sender en gang per dag de etterflgene tre verdiene til et script hos wwwu.sethesource.com: ma (hovedversjonsnummeret p din installerte POPFile), mi (under-versjonsnummeret p din installerte POPFile) og bn (build nummer p din installerte POPFile). POPFile mottar et svar i form av et stykke grafikk som vises i toppen av siden, hvis en ny version er tilgjengelig. Min web-server tar vare p denne log-filen omtrent 5 dager og de blir s slettet; Jeg lagrer ingen forbindelse mellom statistikken og individuelle IP-adresser.) Security_PasswordTitle Brukergrensesnittets Passord Security_Password Passord Security_PasswordUpdate Oppdater passord til %s Security_AUTHTitle Godkjenning av sikkert passord Security_SecureServer Sikker Server Security_SecureServerUpdate Opdaterte sikker server til %s; denne endringen vil ikke tre i kraft fr omstart av POPFile Security_SecurePort Sikker port Security_SecurePortUpdate Opdaterte porten til %s; denne endringen vil ikke tre i kraft fr omstart av POPFile Security_POP3 Godta POP3-tilkoblinger fra andre maskiner Security_UI Godta HTTP (Brukergrensesnitt) tilkoblinger fra andre maskiner Security_UpdateTitle Automatisk Oppdaterings-kontroll Security_Update Kontroller daglig om det finnes oppdateringer til POPFile Security_StatsTitle Statistikk-rapportering Security_Stats Send statistikk tilbake til John daglig Magnet_Error1 Magneten '%s' finnes allrede i btten'%s' Magnet_Error2 Den nye magneten '%s' er i konflikt med magneten '%s' i btten '%s' og kan gi flertydige resultater. Den nye magneten ble ikke tilfyd. Magnet_Error3 Opprettet den nye magneten '%s' i btten '%s' Magnet_CurrentMagnets N蛆誡ende Magneter Magnet_Message1 De flgende magnetene gjr at e-post alltid blir klassifisert til den spesifiserte btten. Magnet_CreateNew Opprett Ny Magnet Magnet_Explanation Tre typer magneter er anbefalt:

  • Fra adressen eller navn: For eksempel: john@firma.dk for matche en spesifikk adresse,
    firma.dk for matche alle som sender fra firma.dk,
    John Doe for matche en spesifikk person, John for matche alle John'er
  • Til adresse eller navn: Samme som en Fra: Magnet men bare for Til: Adressen i en e-post
  • Emne-ord: For eksempel: hei for matche alle meldinger med ordet hei i emnet
Magnet_MagnetType Magnettyper Magnet_Value Verdier Magnet_Always Tilhrer alltid btten Bucket_Error1 Bttenes navn kan kun inneholde bokstavene a til z med sm bokstaver, samt - og _ Bucket_Error2 Btten med navnet %s eksisterer allerede Bucket_Error3 Opprett btten med navnet %s Bucket_Error4 Skriv venligst ikke et tomt ord Bucket_Error5 Omdp btten %s til %s Bucket_Error6 Slett btten %s Bucket_Title Oversikt Bucket_BucketName Bttenes navn Bucket_WordCount Ordtelling Bucket_WordCounts Ordfordeling Bucket_UniqueWords Unike ord Bucket_SubjectModification Emne-modifisering Bucket_ChangeColor Skift farge Bucket_NotEnoughData Ikke nok data Bucket_ClassificationAccuracy Klassifikasjons-nyaktighet Bucket_EmailsClassified Antall e-post klassifisert Bucket_EmailsClassifiedUpper Antall e-post klassifisert Bucket_ClassificationErrors Klassifiseringsfeil Bucket_Accuracy Nyaktighet Bucket_ClassificationCount Klassifiseringstelling Bucket_ResetStatistics Nullstill Statistikkene Bucket_LastReset Sist nullstilt Bucket_CurrentColor %s N蛆誡ende farge er %s Bucket_SetColorTo Sett %s fargen til %s Bucket_Maintenance Vedlikehold Bucket_CreateBucket Oppret btten med navnet Bucket_DeleteBucket Slett btten med navnet Bucket_RenameBucket Omdp btten med navnet Bucket_Lookup Sk etter Bucket_LookupMessage Sk etter ord i bttene Bucket_LookupMessage2 Skeresultatet for Bucket_LookupMostLikely Det er mest sannsynlig at %s forekommer i %s Bucket_DoesNotAppear

%s forekommer ikke i noen av bttene Bucket_DisabledGlobally Deaktivert globalt Bucket_To til Bucket_Quarantine Karantene SingleBucket_Title Detaljer for %s SingleBucket_WordCount Totalt antall ord i btten SingleBucket_TotalWordCount Totalt antall ord SingleBucket_Percentage Prosentandelen av totalen SingleBucket_WordTable Ord tabell for %s SingleBucket_Message1 Markerte (*) ord er blitt brukt til klassifisere i denne POPFile-sesjonen. Trykk p hvilket som helst ord for sl opp dens sannsynlighet for alle bttene. SingleBucket_Unique %s unike Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of PopFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of PopFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of PopFile, whether it should automatically check for updates to the program, and whether statistics about PopFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that PopFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Nihongo.msg0000664000175000017500000007165111624177330017442 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode ja LanguageCharset EUC-JP LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage jp # These are where to find the documents on the Wiki WikiLink JP FAQLink JP:FAQ RequestFeatureLink JP:RequestFeature MailingListLink JP:mailing_lists DonateLink JP:Donate # Common words that are used on their own all over the interface Apply ナャヘム ApplyChanges ハムケケ、ナャヘム On ON Off OFF TurnOn ON 、ヒ、ケ、 TurnOff OFF 、ヒ、ケ、 Add トノイテ Remove コス Previous チー、リ Next シ。、リ From コケスミソヘ Subject キフセ Cc Cc Classification ハャホ Reclassify コニハャホ Probability ウホホィ Scores ニタナタ QuickMagnets ・ッ・、・テ・ッ・゙・ー・ヘ・テ・ネ Undo 、荀トセ、キ Close ハト、ク、 Find ク。コ Filter ・ユ・」・・ソ。シ Yes 、マ、、 No 、、、、、ィ ChangeToYes 。ヨ、マ、、。ラ、ヒハムケケ ChangeToNo 。ヨ、、、、、ィ。ラ、ヒハムケケ Bucket ・ミ・ア・ト Magnet ・゙・ー・ヘ・テ・ネ Delete コス Create コタョ To ークタ Total ケ邱ラ Rename フセチーハムケケ Frequency ノムナル Probability ウホホィ Score ニタナタ Lookup ク。ココ Word テアク Count ・ォ・ヲ・・ネ Update ケケソキ Refresh コヌソキ、ホセツヨ、ヒケケソキ FAQ FAQ ス鯀エシヤ。ヲス魑リシヤク、ア、ホ Q&A スク ID ID Date ニサ Arrived シソョニサ Size ・オ・、・コ # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title POPFile ・ウ・・ネ・。シ・・サ・・ソ。シ Header_Shutdown POPFile 、ホト莉゚ Header_History ヘホ Header_Buckets ・ミ・ア・ト Header_Configuration タ゚ト Header_Advanced セワコルタ゚ト Header_Security ・サ・ュ・螂・ニ・」 Header_Magnets ・゙・ー・ヘ・テ・ネ Footer_HomePage POPFile ・ロ。シ・爭レ。シ・ク Footer_Manual ・゙・ヒ・螂「・ Footer_Forums ・ユ・ゥ。シ・鬣 Footer_FeedMe エノユ Footer_RequestFeature ヘラヒセ Footer_MailingList ・癸シ・・・ー・・ケ・ネ Footer_Wiki ・ノ・ュ・螂皈・ネ Configuration_Error1 カ霏レ、ハクサ、マ 1 ハクサ、タ、ア、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error2 ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケヘム・ン。シ・ネネヨケ讀マ 1 、ォ、 65535 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error3 POP3 ・ン。シ・ネネヨケ讀マ 1 、ォ、 65535 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error4 ・レ。シ・ク・オ・、・コ、マ 1 、ォ、 1000 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error5 ヘホ、サト、ケニソ、マ 1 、ォ、 366 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error6 TCP ・ソ・、・爭「・ヲ・ネ、マ 10 、ォ、 1800 、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error7 XML RPC ・ン。シ・ネネヨケ讀マ1、ォ、 65535 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error8 SOCKS V ・ラ・・ュ・キ、ホ・ン。シ・ネネヨケ讀マ 1 、ォ、 65535 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Configuration_Error9 ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケヘム・ン。シ・ネネヨケ讀 POP3 ・ン。シ・ネネヨケ讀ネニアー、ヒ、ケ、、ウ、ネ、マ、ヌ、ュ、゙、サ、。」 Configuration_Error10 POP3 ・ン。シ・ネネヨケ讀・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケヘム・ン。シ・ネネヨケ讀ネニアー、ヒ、ケ、、ウ、ネ、マ、ヌ、ュ、゙、サ、。」 Configuration_POP3Port POP3 ・ン。シ・ネネヨケ Configuration_POP3Update POP3 ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Configuration_XMLRPCUpdate XML-RPC ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Configuration_XMLRPCPort XML-RPC ・ン。シ・ネネヨケ Configuration_SMTPPort SMTP ・ン。シ・ネネヨケ Configuration_SMTPUpdate SMTP ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Configuration_NNTPPort NNTP ・ン。シ・ネネヨケ Configuration_NNTPUpdate NNTP ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Configuration_POPFork POP3 ニアサタワツウ、ホオイト Configuration_SMTPFork SMTP ニアサタワツウ、ホオイト Configuration_NNTPFork NNTP ニアサタワツウ、ホオイト Configuration_POP3Separator POP3 ・ロ・ケ・ネフセ。「・ン。シ・ネネヨケ譯「・譯シ・カ。シフセ、ホカ霏レ、ハクサ Configuration_NNTPSeparator NNTP ・ロ・ケ・ネフセ。「・ン。シ・ネネヨケ譯「・譯シ・カ。シフセ、ホカ霏レ、ハクサ Configuration_POP3SepUpdate POP3 カ霏レ、ハクサ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_NNTPSepUpdate NNTP カ霏レ、ハクサ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_UI ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケヘム・ン。シ・ネネヨケ Configuration_UIUpdate ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケヘム・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Configuration_History 1 ・レ。シ・ク、ヒノスシィ、ケ、・癸シ・、ホソ Configuration_HistoryUpdate 1 ・レ。シ・ク、ヒノスシィ、ケ、・癸シ・、ホソ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_Days ヘホ、サト、ケニソ Configuration_DaysUpdate ヘホ、サト、ケニソ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_UserInterface ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケ Configuration_Skins ・ケ・ュ・ Configuration_SkinsChoose ・ケ・ュ・、チェツ、キ、ニ、ッ、タ、オ、、 Configuration_Language クタク Configuration_LanguageChoose クタク、チェツ、キ、ニ、ッ、タ、オ、、 Configuration_ListenPorts ・ン。シ・ネネヨケ Configuration_HistoryView ヘホ Configuration_TCPTimeout TCP ・ウ・ヘ・ッ・キ・逾・ソ・、・爭「・ヲ・ネ Configuration_TCPTimeoutSecs TCP ・ウ・ヘ・ッ・キ・逾・ソ・、・爭「・ヲ・ネ、ホノテソ Configuration_TCPTimeoutUpdate TCP ・ウ・ヘ・ッ・キ・逾・ソ・、・爭「・ヲ・ネ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_ClassificationInsertion ナナサメ・癸シ・、リ、ホ・ニ・ュ・ケ・ネヂニオ。ヌス Configuration_SubjectLine キフセ、ホハムケケ Configuration_XTCInsertion X-Text-Classification ・リ・テ・タ。シ Configuration_XPLInsertion X-POPFile-Link ・リ・テ・タ。シ Configuration_Logging ・・ー Configuration_None 、ハ、キ Configuration_ToScreen ・ウ・・ス。シ・ Configuration_ToFile ・ユ・。・、・ Configuration_ToScreenFile ・ウ・・ス。シ・、ネ・ユ・。・、・ Configuration_LoggerOutput ・・ースミホマ Configuration_GeneralSkins ・ケ・ュ・ Configuration_SmallSkins セョ・ケ・ュ・ Configuration_TinySkins コヌセョ・ケ・ュ・ Configuration_CurrentLogFile <クスコ゚、ホ・・ー・ユ・。・、・> Configuration_SOCKSServer SOCKS V ・ラ・・ュ・キ ・オ。シ・ミ。シ Configuration_SOCKSPort SOCKS V ・ラ・・ュ・キ ・ン。シ・ネネヨケ Configuration_SOCKSPortUpdate SOCKS V ・ラ・・ュ・キ、ホ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_SOCKSServerUpdate SOCKS V ・ラ・・ュ・キ、ホ・オ。シ・ミ。シ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Configuration_Fields ヘホ・ソ・ヨ、ヒノスシィ、ケ、ケ猯ワ Advanced_Error1 '%s' 、マエ、ヒフオサ、ケ、テアク、ホ・・ケ・ネ、ヒエ゙、゙、、ニ、、、゙、ケ。」 Advanced_Error2 フオク、ハハクサ、ャサネ、、、ニ、、、゙、ケ。」コニナルニホマ、キ、ニイシ、オ、、。」 Advanced_Error3 '%s' 、フオサ、ケ、テアク、ホ・・ケ・ネ、ヒトノイテ、キ、゙、キ、ソ。」 Advanced_Error4 '%s' 、マフオサ、ケ、テアク、ホ・・ケ・ネ、ヒエ゙、゙、、ニ、、、゙、サ、。」 Advanced_Error5 '%s' 、フオサ、ケ、テアク、ホ・・ケ・ネ、ォ、鮗ス、キ、゙、キ、ソ。」 Advanced_StopWords フオサ、ケ、テアク Advanced_Message1 POPFile 、マーハイシ、ホノムネヒ、ヒサネ、、、テアク、フオサ、キ、゙、ケ。」 Advanced_AddWord テアクトノイテ Advanced_RemoveWord テアクコス Advanced_AllParameters POPFile チエ・ム・鬣癸シ・ソ。シ Advanced_Parameter ・ム・鬣癸シ・ソ。シ Advanced_Value テヘ Advanced_Warning ーハイシ、マ POPFile 、ホチエ、ニ、ホ・ム・鬣癸シ・ソ。シ、ホ・・ケ・ネ、ヌ、ケ。」・「・ノ・ミ・・ケ・ノ。ヲ・譯シ・カ。シタヘム、ヌ、ケ。」テヘ、ハムケケ、キ、ニケケソキ・ワ・ソ・、・ッ・・テ・ッ、キ、ニイシ、オ、、。」・ミ・・ヌ・」・ニ・」。シ。ハツナナタュ。ヒ・チ・ァ・テ・ッ、マケヤ、、、゙、サ、。」ツタサ、ヌノスシィ、オ、、ニ、、、ケ猯ワ、マ・ヌ・ユ・ゥ・・ネタ゚ト熙ォ、鯡ムケケ、オ、、ソ、筅ホ、ヌ、ケ。」・ェ・ラ・キ・逾、ヒ、ト、、、ニ、ホセワコル、マ。「・ェ・ラ・キ・逾。ヲ・・ユ・。・・・ケ、サイセネ、キ、ニ、ッ、タ、オ、、。」 Advanced_ConfigFile タ゚ト・ユ・。・、・: History_Filter  (%s ・ミ・ア・ト、ホ、゚、ノスシィ) History_FilterBy ・ユ・」・・ソ・・・ー History_Search  (コケスミソヘ/キフセ 、ク。コ: %s) History_Title コヌカ皃ホ・皈テ・サ。シ・ク History_Jump シ。、ホ・皈テ・サ。シ・ク、ヒ・ク・罕・ラ History_ShowAll チエ、ニノスシィ History_ShouldBe コニハャホ狢 History_NoFrom コケスミソヘ、ハ、キ History_NoSubject キフセ、ハ、キ History_ClassifyAs ハャホ狢 History_MagnetUsed ・゙・ー・ヘ・テ・ネサネヘム History_MagnetBecause ・゙・ー・ヘ・テ・ネサネヘム

%s 、ヒハャホ爨オ、、゙、キ、ソ。」(・゙・ー・ヘ・テ・ネ %s 、ホ、ソ、)

History_ChangedTo ハムケケタ %s History_Already %s 、ヒハャホ爨オ、、゙、キ、ソ History_RemoveAll チエ、ニコス History_RemovePage 、ウ、ホ・レ。シ・ク、コス History_RemoveChecked ・チ・ァ・テ・ッ、オ、、ソ、筅ホ、コス History_Remove ヘホ、ォ、鬣皈テ・サ。シ・ク、コス History_SearchMessage コケスミソヘ/キフセ 、ク。コ History_NoMessages ・皈テ・サ。シ・ク、マ、「、熙゙、サ、 History_NoMatchingMessages セキ、ヒーテラ、ケ、・皈テ・サ。シ・ク、マ、「、熙゙、サ、 History_ShowMagnet ・゙・ー・ヘ・テ・ネ History_Negate_Search セキ、ヒ、「、、ハ、、、筅ホ、ク。コ History_Magnet  (・゙・ー・ヘ・テ・ネハャホ爨オ、、ソ・皈テ・サ。シ・ク、ホ、゚、ノスシィ) History_NoMagnet  (・゙・ー・ヘ・テ・ネハャホ爨オ、、ハ、ォ、テ、ソ・皈テ・サ。シ・ク、ホ、゚、ノスシィ) History_ResetSearch ・・サ・テ・ネ History_ChangedClass クスコ゚、ホ・ウ。シ・ム・ケ、ヒ、隍ハャホ History_Purge 、ケ、ー、ヒコス History_Increase ケュ、ッ History_Decrease カケ、ッ History_Column_Characters コケスミソヘ。「ークタ陦「Cc。「キフセヘ、ホノ、ハムケケ History_Automatic シォニー History_Reclassified コニハャホ爨オ、、゙、キ、ソ History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title ・ム・ケ・。シ・ノ Password_Enter ・ム・ケ・。シ・ノ、ニホマ、キ、ニ、ッ、タ、オ、、 Password_Go ・・ー・、・ Password_Error1 ・ム・ケ・。シ・ノ、ャエヨー网テ、ニ、、、゙、ケ Security_Error1 ヌァセレ・ン。シ・ネネヨケ讀マ 1 、ォ、 65535 、゙、ヌ、ヒ、キ、ニ、ッ、タ、オ、、。」 Security_Stealth ・ケ・ニ・・ケ・筍シ・ノ/・オ。シ・ミ。シ・ェ・レ・。シ・キ・逾 Security_NoStealthMode 、、、、、ィ (・ケ・ニ・・ケ・筍シ・ノ) Security_StealthMode (・ケ・ニ・・ケ・筍シ・ノ) Security_ExplainStats (、ウ、ホ・ェ・ラ・キ・逾、ヘュク、ヒ、ケ、、ネ。「POPFile 、マヒ霹ーイーハイシ、ホサー、ト、ホ・ヌ。シ・ソ、 getpopfile.org セ螟ホ・ケ・ッ・・ラ・ネ、ヒチ、熙゙、ケ。」bc (・ミ・ア・ト、ホチソ)。「mc (POPFile 、ャハャホ爨キ、ソ・皈テ・サ。シ・ク、ホチソ)。「ec (ハャホ爭ィ・鬘シ、ホチソ)。」、ウ、、鬢ホサー、ト、ホテヘ、マ・ヌ。シ・ソ・ル。シ・ケ、ヒオュマソ、オ、。「POPFile 、ャ、ノ、ホ、隍ヲ、ヒサネヘム、オ、。「、ノ、ホトナル、ホクイフ、、「、イ、ニ、、、、ホ、ォ、シィ、ケナキラセハ、コタョ、ケ、、ホ、ヒサネ、、、゙、ケ。」Web ・オ。シ・ミ。シ、マ、ウ、、鬢ホ・・ー・ユ・。・、・、ソニエヨハンツク、キ、ソ、「、ネ。「コス、キ、゙、ケ。」、ウ、、鬢ホナキラテヘ、 IP ・「・ノ・・ケ、ネエリマ「ノユ、ア、ニハンツク、ケ、、ウ、ネ、マ、、、テ、オ、、、「、熙゙、サ、) Security_ExplainUpdate (、ウ、ホ・ェ・ラ・キ・逾、ヘュク、ヒ、ケ、、ネ。「POPFile 、マヒ霹ーイ。「ーハイシ、ホサー、ト、ホ・ヌ。シ・ソ、 getpopfile.org セ螟ホ・ケ・ッ・・ラ・ネ、ヒチ、熙゙、ケ。」ma (・、・・ケ・ネ。シ・、オ、、ニ、、、 POPFile 、ホ・皈ク・罍シ・ミ。シ・ク・逾ネヨケ)。「mi (・、・・ケ・ネ。シ・、オ、、ニ、、、 POPFile 、ホ・゙・、・ハ。シ・ミ。シ・ク・逾ネヨケ)。「bn (・、・・ケ・ネ。シ・、オ、、ニ、、、 POPFile 、ホ・モ・・ノネヨケ)。」ソキ、キ、、・ミ。シ・ク・逾、ャ・・遙シ・ケ、オ、、、ネ。「POPFile 、マ、ス、ホセハ、シ、ア、ニ・レ。シ・ク、ホセ衙、ヒ・ー・鬣ユ・」・テ・ッ、ノスシィ、キ、ニ、ェテホ、鬢サ、キ、゙、ケ。」Web ・オ。シ・ミ。シ、マ、ウ、、鬢ホ・・ー・ユ・。・、・、ソニエヨハンツク、キ、ソ、「、ネ。「コス、キ、゙、ケ。」、ウ、、鬢ホケケソキ・チ・ァ・テ・ッ、ヒサネヘム、キ、ソ・ヌ。シ・ソ、 IP ・「・ノ・・ケ、ネエリマ「ノユ、ア、ニハンツク、ケ、、ウ、ネ、マ、、、テ、オ、、、「、熙゙、サ、) Security_PasswordTitle ・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケ・ム・ケ・。シ・ノ Security_Password ・ム・ケ・。シ・ノ Security_PasswordUpdate ・ム・ケ・。シ・ノ、ハムケケ、キ、゙、キ、ソ Security_AUTHTitle ・・筍シ・ネ・オ。シ・ミ。シ Security_SecureServer ・・筍シ・ネ POP3 ・オ。シ・ミ。シ (SPA/AUTH 、゙、ソ、マ ニゥイ皈ラ・・ュ・キ) Security_SecureServerUpdate ・・筍シ・ネ POP3 ・オ。シ・ミ。シ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Security_SecurePort ・・筍シ・ネ POP3 ・ン。シ・ネネヨケ (SPA/AUTH 、゙、ソ、マ ニゥイ皈ラ・・ュ・キ) Security_SecurePortUpdate ・・筍シ・ネ POP3 ・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Security_SMTPServer SMTP ・チ・ァ。シ・・オ。シ・ミ。シ Security_SMTPServerUpdate SMTP ・チ・ァ。シ・・オ。シ・ミ。シ、 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Security_SMTPPort SMTP ・チ・ァ。シ・・ン。シ・ネネヨケ Security_SMTPPortUpdate SMTP ・チ・ァ。シ・・ン。シ・ネネヨケ讀 %s 、ヒハムケケ、キ、゙、キ、ソ。」、ウ、ホハムケケ、マ POPFile 、コニオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Security_POP3 ・・筍シ・ネ・゙・キ・、ォ、鬢ホ POP3 タワツウ、ヌァ、皃 (POPFile 、ホコニオッニー、ャノャヘラ) Security_SMTP ・・筍シ・ネ・゙・キ・、ォ、鬢ホ SMTP タワツウ、ヌァ、皃 (POPFile 、ホコニオッニー、ャノャヘラ) Security_NNTP ・・筍シ・ネ・゙・キ・、ォ、鬢ホ NNTP タワツウ、ヌァ、皃 (POPFile 、ホコニオッニー、ャノャヘラ) Security_UI ・・筍シ・ネ・゙・キ・、ォ、鬢ホ HTTP タワツウ(・譯シ・カ。シ・、・・ソ。シ・ユ・ァ。シ・ケ、ホヘヘム)、ヌァ、皃 (POPFile 、ホコニオッニー、ャノャヘラ) Security_XMLRPC ・・筍シ・ネ・゙・キ・、ォ、鬢ホ XML-RPC タワツウ、ヌァ、皃 (POPFile 、ホコニオッニー、ャノャヘラ) Security_UpdateTitle ケケソキシォニー・チ・ァ・テ・ッ Security_Update POPFile 、ャケケソキ、オ、、ニ、、、、ォ、ノ、ヲ、ォヒ霹・チ・ァ・テ・ッ、キ、゙、ケ Security_StatsTitle ナキラセハ・・ン。シ・ネ Security_Stats ナキラセハ、ヒ霹チ、 Magnet_Error1 ・゙・ー・ヘ・テ・ネ '%s' 、ヒ、マエ、ヒ・ミ・ア・ト '%s' 、ウ荀ナ、ニ、ニ、、、゙、ケ。」 Magnet_Error2 ソキオャ・゙・ー・ヘ・テ・ネ '%s' 、マエ、ヒ、「、・゙・ー・ヘ・テ・ネ '%s' (・ミ・ア・ト '%s' 、ャウ荀ナ、ニ、鬢、ニ、、、゙、ケ) 、ネセラニヘ、ケ、、ソ、癸「タオ、キ、、ス靉、、ェ、ウ、ハ、ヲ、ウ、ネ、ャ、ヌ、ュ、゙、サ、。」ソキオャ・゙・ー・ヘ・テ・ネ、マトノイテ、オ、、゙、サ、、ヌ、キ、ソ。」 Magnet_Error3 ソキオャ・゙・ー・ヘ・テ・ネ '%s' 、ヒ・ミ・ア・ト '%s' 、ウ荀ナ、ニ、゙、キ、ソ。」 Magnet_CurrentMagnets クスコ゚、ホ・゙・ー・ヘ・テ・ネ Magnet_Message1 シ。、ホ・゙・ー・ヘ・テ・ネ、ヒ、隍遙「・癸シ・、セ、ヒニテト熙ホ・ミ・ア・ト、ヒハャホ爨キ、゙、ケ。」 Magnet_CreateNew ソキオャ・゙・ー・ヘ・テ・ネコタョ Magnet_Explanation ・゙・ー・ヘ・テ・ネ、ヒ、マサー、ト、ホ・ソ・、・ラ、ャ、「、熙゙、ケ:
  • コケスミソヘ、ホ・「・ノ・・ケ、゙、ソ、マフセチー: ホ: john@company.com 、ホ、隍ヲ、ヒニテト熙ホ・「・ノ・・ケ、ャ・゙・テ・チ、ケ、。「
    company.com 、ホ、隍ヲ、ヒ company.com 、ヒツー、ケ、チエ、ニ、ホソヘ、ソ、チ、ャ・゙・テ・チ、ケ、。「
    John Doe 、ホ、隍ヲ、ヒニテト熙ホソヘ、ャ・゙・テ・チ、ケ、。「John 、ホ、隍ヲ、ヒJohn 、ネ、、、ヲフセチー、サ、トチエ、ニ、ホソヘ、ソ、チ、ャ・゙・テ・チ、ケ、。」
  • ークタ隍ホ・「・ノ・・ケ、゙、ソ、マフセチー: From: magnet 、ネニアヘヘ、ヌ、ケ、ャ・癸シ・、ホ To: ・「・ノ・・ケ、ャツミセン、ヌ、ケ。」
  • キフセ、ヒエ゙、゙、、テアク: ホ: hello 、ネ、ケ、、ネ hello 、キフセ、ヒエ゙、狠エ、ニ、ホ・皈テ・サ。シ・ク、ャ・゙・テ・チ、キ、゙、ケ。」
Magnet_MagnetType ・゙・ー・ヘ・テ・ネ・ソ・、・ラ Magnet_Value テヘ Magnet_Always ハャホ狢隍ホ・ミ・ア・ト Magnet_Jump ・゙・ー・ヘ・テ・ネ・レ。シ・ク、ヒ・ク・罕・ラ Bucket_Error1 ・ミ・ア・トフセ、ヒ、マ・「・・ユ・。・ル・テ・ネ、ホセョハクサ(a 、ォ、 z 、゙、ヌ)、ォ - (・マ・、・ユ・)。「、゙、ソ、マ _ (・「・・タ。シ・ケ・ウ・「)、キ、ォサネ、ィ、゙、サ、。」 Bucket_Error2 ・ミ・ア・ト %s 、マエ、ヒ、「、熙゙、ケ。」 Bucket_Error3 ・ミ・ア・ト %s 、コタョ、キ、゙、キ、ソ。」 Bucket_Error4 ・ケ・レ。シ・ケ、マニホマ、キ、ハ、、、ヌ、ッ、タ、オ、、。」 Bucket_Error5 ・ミ・ア・ト %s 、 %s 、ヒハムケケ、キ、゙、キ、ソ。」 Bucket_Error6 ・ミ・ア・ト %s 、コス、キ、゙、キ、ソ。」 Bucket_Title ・オ・゙・遙シ Bucket_BucketName ・ミ・ア・トフセ Bucket_WordCount テアクソ Bucket_WordCounts テアクソ Bucket_UniqueWords クヌヘュテアクソ Bucket_SubjectModification キフセ、ホハムケケ Bucket_ChangeColor ソァ、ホハムケケ Bucket_NotEnoughData ・ヌ。シ・ソノヤススハャ Bucket_ClassificationAccuracy ハャホ狢コナル Bucket_EmailsClassified ハャホ爨オ、、ソ・癸シ・ソ Bucket_EmailsClassifiedUpper ハャホ爨オ、、ソ・癸シ・ソ Bucket_ClassificationErrors ハャホ爭ィ・鬘シ、ホソ Bucket_Accuracy タコナル Bucket_ClassificationCount ハャホ狒 Bucket_ClassificationFP クク。スミ Bucket_ClassificationFN クォニィ、キ Bucket_ResetStatistics ・・サ・テ・ネ Bucket_LastReset コヌク螟ホ・・サ・テ・ネ Bucket_CurrentColor %s クスコ゚、ホソァ、マ %s Bucket_SetColorTo %s 、ホソァ、 %s 、ヒタ゚ト Bucket_Maintenance エノヘ Bucket_CreateBucket ・ミ・ア・トコタョ Bucket_DeleteBucket ・ミ・ア・トコス Bucket_RenameBucket ・ミ・ア・ト、ホフセチーハムケケ Bucket_Lookup ク。ココ Bucket_LookupMessage ・ミ・ア・トニ筅ヌテアク、ク。ココ Bucket_LookupMessage2 ク。ココキイフ : Bucket_LookupMostLikely %s 、マ %s ニ筅ヒ、「、イトヌスタュ、ャツ遉ュ、、、ヌ、ケ。」 Bucket_DoesNotAppear

%s 、マ、ノ、ホ・ミ・ア・ト、ホテ讀ヒ、筅「、熙゙、サ、。」 Bucket_InIgnoredWords %s 、マフオサ、ケ、テアク、ヒエ゙、゙、、ニ、、、゙、ケ。」POPFile 、マ、ウ、ホテアク、フオサ、キ、゙、ケ。」 Bucket_DisabledGlobally チエ、ニ OFF Bucket_To 、 Bucket_Quarantine ウヨホ・ SingleBucket_Title %s 、ホセワコル SingleBucket_WordCount ・ミ・ア・トニ篥アクソ SingleBucket_TotalWordCount チテアクソ SingleBucket_Percentage チソ、ヒツミ、ケ、ウ荵 SingleBucket_WordTable %s 、ホテアクノス SingleBucket_Message1 ・「・ケ・ソ・・ケ・ッ (*) 、ャノユ、、、ソテアク、マクスコ゚、ホ POPFile ・サ・テ・キ・逾テ讀ホハャホ爨ヒサネ、、、゙、キ、ソ。」、ケ、ル、ニ、ホ・ミ・ア・ト、ヒツミ、ケ、ウホホィ、ク。ココ、ケ、、ヒ、マテアク、・ッ・・テ・ッ、キ、ニイシ、オ、、。」 SingleBucket_Unique クヌヘュテアクソ %s SingleBucket_ClearBucket チエ、ニ、ホテアク、コス Session_Title POPFile ・サ・テ・キ・逾、マスェホサ、キ、゙、キ、ソ。」 Session_Error POPFile ・サ・テ・キ・逾、マスェホサ、キ、゙、キ、ソ。」、ウ、、マ。「POPFile 、オッニー、キ、ソ、スェホサ、キ、ソ、ホ、ヒ。「・ヨ・鬣ヲ・カ。シ、ウォ、、、ソ、゙、゙、ヒ、キ、ニ、、、、ネオッ、ウ、イトヌスタュ、ャ、「、熙゙、ケ。」POPFile 、ー、ュツウ、ュサネヘム、ケ、、ヒ、マ。「セ螟ヒノスシィ、オ、、ニ、、、・・・ッ、ホニ筅ホー、ト、・ッ・・テ・ッ、キ、ニイシ、オ、、。」 View_Title ・キ・・ー・・皈テ・サ。シ・ク・モ・蝪シ View_ShowFrequencies テアク、ホノムナル、ノスシィ View_ShowProbabilities テアク、ホウホホィ、ノスシィ View_ShowScores テアク、ホニタナタ、ノスシィ View_WordMatrix テアク・゙・ネ・・ッ・ケ View_WordProbabilities ウホホィ View_WordFrequencies ノムナル View_WordScores ニタナタ View_Chart ハャホ犢霪ゾ View_DownloadMessage ・皈テ・サ。シ・ク、・タ・ヲ・・。シ・ノ View_MessageHeader ・皈テ・サ。シ・ク・リ・テ・タ。シ View_MessageBody ・皈テ・サ。シ・クヒワハク Windows_TrayIcon POPFile 、ホ・「・、・ウ・、 Windows ・キ・ケ・ニ・爭ネ・・、、ヒノスシィ、キ、゙、ケ、ォ。ゥ Windows_Console POPFile 、ホ・皈テ・サ。シ・ク、・ウ・・ス。シ・・ヲ・」・・ノ・ヲ、ヒスミホマ、キ、゙、ケ、ォ。ゥ Windows_NextTime

、ウ、ホハムケケ、マ POPFile 、シ。イオッニー、ケ、、゙、ヌヘュク、ヒ、ハ、熙゙、サ、。」 Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of a message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency with which that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify messages according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying messages due to their relative frequency in messages in general. They are organized per row according to the first letter of the words. Imap_Bucket2Folder '%s' ・ミ・ア・ト、ヒハャホ爨オ、、ソ・癸シ・、ホーワニータ Imap_MapError ハ」ソ、ホ・ミ・ア・ト、、メ、ネ、ト、ホ・ユ・ゥ・・タ、ヒツミアノユ、ア、ケ、、ウ、ネ、マ、ヌ、ュ、゙、サ、。」 Imap_Server IMAP ・オ。シ・ミ。シ ・ロ・ケ・ネフセ: Imap_ServerNameError ・オ。シ・ミ。シ、ホ・ロ・ケ・ネフセ、ニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_Port IMAP ・オ。シ・ミ。シ ・ン。シ・ネネヨケ: Imap_PortError タオ、キ、、・ン。シ・ネネヨケ讀ニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_Login IMAP ・「・ォ・ヲ・・ネ ・譯シ・カ。シフセ: Imap_LoginError ・譯シ・カ。シフセ。ソ・・ー・、・フセ、ニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_Password IMAP ・「・ォ・ヲ・・ネ、ホ・ム・ケ・。シ・ノ: Imap_PasswordError ・オ。シ・ミ。シ、ヒツミ、ケ、・ム・ケ・。シ・ノ、ニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_Expunge エニサ・ユ・ゥ・・タ、ォ、魏ワニー、オ、、ソ・皈テ・サ。シ・ク、コス、ケ、。」 Imap_Interval ケケソキ、ホエヨウヨ。ハノテ。ヒ: Imap_IntervalError ケケソキエヨウヨ、マ 10 ノテ、ォ、 3600 ノテ、ホエヨ、ヌニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_Bytelimit ハャホ爨ホ、ソ、皃ヒサネヘム、ケ、・皈テ・サ。シ・ク、ホ・ミ・、・ネソ。」0。ハカヌ。ヒ、ホセケ遑「・皈テ・サ。シ・ク、ホチエツホ、サネヘム、キ、゙、ケ: Imap_BytelimitError ソサ、ニホマ、キ、ニ、ッ、タ、オ、、。」 Imap_RefreshFolders ・ユ・ゥ・・タ・・ケ・ネ、ホケケソキ Imap_Now シツケヤ Imap_UpdateError1 ・・ー・、・、ヌ、ュ、゙、サ、。」・譯シ・カ。シフセ、ネ・ム・ケ・。シ・ノ、ウホヌァ、キ、ニ、ッ、タ、オ、、。」 Imap_UpdateError2 ・オ。シ・ミ。シ、ヒタワツウ、ヌ、ュ、゙、サ、。」・ロ・ケ・ネフセ、ネ・ン。シ・ネネヨケ讀ウホヌァ、ケ、、ネ、ネ、筅ヒ。「・、・・ソ。シ・ヘ・テ・ネ、ヒタワツウ、オ、、ニ、、、、ォ、ノ、ヲ、ォ、ウホヌァ、キ、ニ、ッ、タ、オ、、。」 Imap_UpdateError3 ・オ。シ・ミ。シ、ヒタワツウ、ケ、、ソ、皃ホセハ、タ隍ヒタ゚ト熙キ、ニ、ッ、タ、オ、、。」 Imap_NoConnectionMessage ・オ。シ・ミ。シ、ヒタワツウ、ケ、、ソ、皃ホセハ、タ隍ヒタ゚ト熙キ、ニ、ッ、タ、オ、、。」、ス、ヲ、ケ、、ネ。「、オ、鬢ヒツソ、ッ、ホ・ェ・ラ・キ・逾、ャタ゚ト熙ヌ、ュ、、隍ヲ、ヒ、ハ、熙゙、ケ。」 Imap_WatchMore エニサ・ユ・ゥ・・タ・・ケ・ネ、ヒ・ユ・ゥ・・タ、トノイテ Imap_WatchedFolder エニサ・ユ・ゥ・・タ Imap_Use_SSL SSL 、サネヘム、ケ、 Shutdown_Message POPFile 、マスェホサ、キ、゙、キ、ソ。」 Help_Training POPFile 、、ウ、、ォ、鮟ネ、、サマ、皃セケ遑「、「、トナル、ホ・ネ・。シ・ヒ・・ー、ャノャヘラ、ネ、ハ、熙゙、ケ。」、ス、、マ。「POPFile 、マ、ノ、ホ・癸シ・、ャノャヘラ、ハ・癸シ・、ヌ、ノ、ホ・癸シ・、ャノヤヘラ、ハ・癸シ・、ォ、ヒ、ト、、、ニ、ハ、ヒ、篥ホ、鬢ハ、、、ォ、鬢ヌ、ケ。」・ネ・。シ・ヒ・・ー、マ、ス、、セ、、ホ・ミ・ア・ト、ヒ、ト、、、ニケヤ、ヲノャヘラ、ャ、「、遙ハコヌト网ヌ、筌ア、ト、ホ・ミ・ア・ト、ヒ、ト、、、ニ。「」ア、トーハセ螟ホ・皈テ・サ。シ・ク、コニハャホ爨ケ、。ヒ。「POPFile 、ャハャホ爨エヨー网ィ、ソ・皈テ・サ。シ・ク、タオ、キ、、・ミ・ア・ト、ヒコニハャホ爨ケ、。ハヘホ、ホアヲツヲ、ヒ、「、・皈ヒ・蝪シ、ォ、鯊オ、キ、、ハャホ狢隍チェツ、キ、ニ。ヨコニハャホ爍ラ・ワ・ソ・、・ッ・・テ・ッ、ケ、。ヒ、ウ、ネ、ヒ、隍テ、ニ・ネ・。シ・ヒ・・ー、ケ、、ウ、ネ、ャ、ヌ、ュ、゙、ケ。」、゙、ソ。「POPFile 、ャケヤ、テ、ソハャホ爨ヒ、「、、サ、ニ・ユ・ゥ・・タ、ヒーワニー、ケ、、ハ、ノ。「・癸シ・・ッ・鬣、・「・・ネ、タ゚ト熙ケ、ノャヘラ、ャ、「、熙゙、ケ。」・癸シ・・ッ・鬣、・「・・ネ、ホタ゚ト熙ヒ、ト、、、ニ、マ。「POPFile ・ノ・ュ・螂皈・ニ。シ・キ・逾・ラ・・ク・ァ・ッ・ネ、サイセネ、キ、ニ、ッ、タ、オ、、。」 Help_Bucket_Setup POPFile 、ヌ、マ。「、筅ネ、筅ネ、「、 "unclassified" 、ネ、、、ヲイセチロナェ、ハ・ミ・ア・トーハウー、ヒ。「コヌト网ヌ、筌イ、ト、ホ・ミ・ア・ト、コタョ、ケ、ノャヘラ、ャ、「、熙゙、ケ。」POPFile 、ホニテトァ、マ。「。ハ・癸シ・、 spam 、ネ、ス、ーハウー、ヒハャホ爨ケ、、ネ、、、ヲ、タ、ア、ヌ、マ、ハ、ッ。ヒ、、、ッ、ト、ヌ、筵ミ・ア・ト、コタョ、キ。「、ス、、鬢ヒ・癸シ・、ハャホ爨ケ、、ウ、ネ、ャ、ヌ、ュ、、ウ、ネ、ヌ、ケ。」エハテア、ハタ゚ト熙ヌ、マ。「"spam"。「"personal"。「"work" 、ネ、、、テ、ソ・ミ・ア・ト、タ゚ト熙ケ、、ウ、ネ、ヒ、ハ、、ヌ、キ、遉ヲ。」 Help_No_More シ。イ、ォ、鯔スシィ、キ、ハ、、。」 popfile-1.1.3+dfsg/languages/Nederlands.msg0000664000175000017500000004507511624177330020121 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode nl LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply Doorvoeren On Aan Off Uit TurnOn Zet aan TurnOff Zet uit Add Voeg toe Remove Verwijder Previous Vorige Next Volgende From Van Subject Onderwerp Classification Classificatie Reclassify Herclasseren Undo Maak ongedaan Close Sluiten Find Zoek Filter Filter Yes Ja No Nee ChangeToYes Verander naar Ja ChangeToNo Verander naar Nee Bucket Bak Magnet Magneet Delete Verwijder Create Maak aan To Aan Total Totaal Rename Hernoemen Frequency Frequentie Probability Waarschijnlijkheid Score Score Lookup Bekijk # The header and footer that appear on every UI page Header_Title POPFile Control Center Header_Shutdown Afsluiten Header_History Geschiedenis Header_Buckets Bakken Header_Configuration Configuratie Header_Advanced Gevorderd Header_Security Veiligheid Header_Magnets Magneten Footer_HomePage POPFile Home Page Footer_Manual Handleiding Footer_Forums Forums Footer_FeedMe Voer mij! Footer_RequestFeature Vraag functionaliteit aan Footer_MailingList Mailing Lijst Configuration_Error1 Het scheidingsteken moet een enkel karakter zijn Configuration_Error2 De gebruikers interface poort moet een getal zijn tussen 1 en 65535 Configuration_Error3 De POP3 luisterpoort moet een getal zijn tussen 1 en 65535 Configuration_Error4 De pagina grootte moet een getal zijn tussen 1 en 1000 Configuration_Error5 Het aantal dagen in de geschiedenis moet een getal zijn tussen 1 en 366 Configuration_Error6 De TCP timeout moet een getal zijn tussen 10 en 1800 Configuration_POP3Port POP3 luisterpoort Configuration_POP3Update Poort veranderd naar %s; deze verandering krijgt effect zodra je POPFile herstart hebt Configuration_Separator Scheidingsteken Configuration_SepUpdate Scheidingsteken veranderd naar %s Configuration_UI Gebruikers interface web poort Configuration_UIUpdate Gebruikers interface web poort veranderd naar %s; deze verandering krijgt effect zodra je POPFile herstart hebt Configuration_History Aantal emails per pagina Configuration_HistoryUpdate Aantal emails per pagina veranderd naar %s Configuration_Days Aantal dagen geschiedenis om te bewaren Configuration_DaysUpdate Aantal dagen geschiedenis om te bewaren veranderd naar %s Configuration_UserInterface Gebruikers Interface Configuration_Skins Huiden Configuration_SkinsChoose Kies huid Configuration_Language Taal Configuration_LanguageChoose Kies Taal Configuration_ListenPorts Luister Poorten Configuration_HistoryView Geschiedenis View Configuration_TCPTimeout TCP Connectie Timeout Configuration_TCPTimeoutSecs TCP Connectie Timeout in seconden Configuration_TCPTimeoutUpdate TCP Connectie Timeout veranderd naar %s Configuration_ClassificationInsertion Classificatie toevoeging Configuration_SubjectLine Onderwerp regel verandering Configuration_XTCInsertion X-Text-Classification toevoeging Configuration_XPLInsertion X-POPFile-Link toevoeging Configuration_Logging Logging Configuration_None Geen Configuration_ToScreen Naar het scherm Configuration_ToFile Naar een bestand Configuration_ToScreenFile Naar het scherm en naar een bestand Configuration_LoggerOutput Logger uitvoer Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Advanced_Error1 '%s' zit al in de lijst met stopwoorden Advanced_Error2 stopwoorden mogen alleen alphanumerieke, ., _, -, of @ karakters bevatten Advanced_Error3 '%s' is toegevoegd aan de lijst met stopwoorden Advanced_Error4 '%s' zit niet in de lijst met stopwoorden Advanced_Error5 '%s' is verwijderd van de lijst met stopwoorden Advanced_StopWords Stopwoorden Advanced_Message1 De volgende woorden worden genegeerd bij alle classificaties omdat ze zeer vaak voorkomen. Advanced_AddWord Voeg woord toe Advanced_RemoveWord Verwijder woord History_Filter  (alleen uit bak %s) History_FilterBy Filter By History_Search  (gezocht op onderwerp %s) History_Title Recente Berichten History_Jump Spring naar bericht History_ShowAll Laat alles zien History_ShouldBe Moet zijn History_NoFrom geen van regel History_NoSubject geen onderwerp regel History_ClassifyAs Classificeer als History_MagnetUsed Magneet gebruikt History_ChangedTo Veranderd naar %s History_Already Is al gereclassificeerd als %s History_RemoveAll Verwijder alles History_RemovePage Verwijder pagina History_Remove Om berichten te verwijderen in de geschiedenis klik History_SearchMessage Zoek onderwerp History_NoMessages Geen berichten Password_Title Wachtwoord Password_Enter Voer wachtwoord in Password_Go Go! Password_Error1 Ongeldig wachtwoord Security_Error1 De veilige poort moet een nummer zijn tussen 1 en 65535 Security_Stealth Undercover modus/Server operatie Security_NoStealthMode Nee (Undercover modus) Security_ExplainStats (als dit aan staat stuurt POPFile 鳬n keer per dag de volgende drie waarden naar een script op getpopfile.org: bc (het aantal bakken dat je hebt), mc (het totaal aantal geclassificeerde berichten door POPFile) en ec (het totaal aantal fouten tijdens classificatie). Deze waarden worden opgeslagen in een bestand en ik zal deze gegevens gebruiken om statistieken te publiceren over hoe mensen POPFile gebruiken en hoe goed het werkt. Mijn web server houdt de log bestanden 5 dagen vast waarna ze verwijderd zullen worden; Ik bewaar geen gegevens over het verband tussen de statistieken en individuele IP adressen.) Security_ExplainUpdate (als dit aan staat stuurt POPFile 鳬n keer per dag de volgende drie waarden naar een script op getpopfile.org: ma (het grote versie nummer van jouw POPFile installatie), mi (het kleine versie nummer van jouw POPFile installatie) en bn (het bouwnummer van jouw versie van POPFile). POPFile ontvangt in reactie hierop een plaatje dat bovenaan de pagina afgebeeld wordt als er een nieuwe versie van POPFile beschikbaar is. Mijn web server houdt de log bestanden 5 dagen vast waarna ze verwijderd zullen worden; Ik bewaar geen gegevens over het verband tussen de update checks en individuele IP adressen.) Security_PasswordTitle Gebruikers Interface Wachtwoord Security_Password Wachtwoord Security_PasswordUpdate Wachtwoord veranderd naar %s Security_AUTHTitle Veilig Wachtwoord Authentificatie (AUTH) Security_SecureServer Veilige Server Security_SecureServerUpdate Veilige server veranderd naar %s; deze verandering krijgt effect zodra je POPFile herstart hebt Security_SecurePort Veilige poort Security_SecurePortUpdate Veilige poort veranderd naar %s; deze verandering krijgt effect zodra je POPFile herstart hebt Security_POP3 Accepteer POP3 verbindingen van andere machines Security_UI Accepteer HTTP (Gebruikers Interface) verbindingen van andere machines Security_UpdateTitle Automatische Update controle Security_Update Controleer dagelijks op nieuwe versies van POPFile Security_StatsTitle Rapporteer statistieken Security_Stats Stuur dagelijks statistieken naar John terug Magnet_Error1 Magneet'%s' bestaat al in bak '%s' Magnet_Error2 Nieuwe magneet '%s' botst met magneet '%s' in bak '%s' en kan voor verwarrende resultaten leiden. Nieuwe magneet niet toegevoegd. Magnet_Error3 Maak nieuwe magneet '%s' in bak '%s' Magnet_CurrentMagnets Huidige magneten Magnet_Message1 De volgende magneten zorgen er altijd voor dat berichten in de gespecificeerde bak vallen. Magnet_CreateNew Maak Nieuwe Magneet Magnet_Explanation Er zijn drie type magneten beschikbaar:

  • Van adres of naam: B.v.: john@company.com om een specifiek adres te specificeren,
    company.com om iedereen te specificeren die berichten sturen vanaf company.com,
    John Doe om een bepaalde persoon te specificeren, John om alle Johns te specificeren
  • Naar adres of naam: Net als een "Van" magneet maar nu voor de geadresseerde
  • Onderwerp woorden: B.v.: Hallo om alle berichten met Hallo in het onderwerp te specificeren.
Magnet_MagnetType Magneet type Magnet_Value Waarde Magnet_Always Gaat altijd naar bak Bucket_Error1 Baknamen kunnen alleen a t/m z (geen hoofdletters) en - en _ karakters bevatten Bucket_Error2 Baknaam %s bestaat al Bucket_Error3 Bak aangemaakt met naam %s Bucket_Error4 Voert u a.u.b. een woord in Bucket_Error5 Bak %s hernoemd naar %s Bucket_Error6 Bak %s verwijderd Bucket_Title Opsomming Bucket_BucketName Baknaam Bucket_WordCount Aantal woorden Bucket_WordCounts Aantal woorden Bucket_UniqueWords Unieke woorden Bucket_SubjectModification Onderwerp aanpassing Bucket_ChangeColor Verander kleur Bucket_NotEnoughData Niet genoeg gegevens Bucket_ClassificationAccuracy Classificatie precisie Bucket_EmailsClassified Berichten geclassificeerd Bucket_EmailsClassifiedUpper Berichten Geclassificeerd Bucket_ClassificationErrors Classificatiefouten Bucket_Accuracy Precisie Bucket_ClassificationCount Aantal Classificaties Bucket_ResetStatistics Herstart statistieken Bucket_LastReset Laatste Herstart Bucket_CurrentColor %s huidige kleur is %s Bucket_SetColorTo Zet %s kleur op %s Bucket_Maintenance Onderhoud Bucket_CreateBucket Maak bak aan met naam Bucket_DeleteBucket Verwijder bak met naam Bucket_RenameBucket Hernoem bak met naam Bucket_Lookup Bekijk Bucket_LookupMessage Bekijk woord in bak Bucket_LookupMessage2 Resultaat voor Bucket_LookupMostLikely %s komt het meest waarschijnlijk voor in %s Bucket_DoesNotAppear

%s komt niet voor in een van de bakken Bucket_DisabledGlobally Globaal uitgeschakeld Bucket_To naar SingleBucket_Title Details voor %s SingleBucket_WordCount Aantal woorden in bak SingleBucket_TotalWordCount Totaal aantal woorden SingleBucket_Percentage Percentage van totaal SingleBucket_WordTable Woordentabel voor %s SingleBucket_Message1 Woorden met een sterretje (*) zijn gebruikt voor classificatie in deze POPFile sessie. Klik op een woord om de waarschijnlijkheid te zien voor alle bakken. SingleBucket_Unique %s uniek Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of PopFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of PopFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of PopFile, whether it should automatically check for updates to the program, and whether statistics about PopFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that PopFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Korean.msg0000664000175000017500000005045011624177330017252 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode ko LanguageCharset euc-kr LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage kr # Common words that are used on their own all over the interface Apply タソ On サ鄙 チ゚ Off サ鄙 セハタス TurnOn サ ソ TurnOff サ鄙 セネヌヤ Add テ゚ー。 Remove チヲーナ Previous タフタ Next エルタス From ケ゚スナタレ Subject チヲク Cc ツチカ Classification コミキ Reclassify タ郤ミキ Probability ネョキ Scores チ。シ QuickMagnets コク・ タレショ Undo テシメ Close エンア Find テ」ア Filter ーノキッウソ Yes ソケ No セニエマソタ ChangeToYes 'ソケ'キホ ケルイ゙ ChangeToNo 'セニエマソタ'キホ ケルイ゙ Bucket ケナカ Magnet タレショ Delete サ霖ヲ Create サシコ To シスナタレ Total タテシ Rename タフクァケルイルア Frequency コオオ Probability ネョキ Score チ。シ Lookup ーヒサ Word エワセ Count シ Update シチ、 Refresh ー貎ナ # The header and footer that appear on every UI page Header_Title ニヒニトタマ チヲセ シセナヘ Header_Shutdown ニヒニトタマ チセキ Header_History ネスコナ荳ョ Header_Buckets ケナカ Header_Configuration シウチ、 Header_Advanced ーア゙ Header_Security コクセネ Header_Magnets タレショ Footer_HomePage ニヒニトタマ ネィニ菎フチ Footer_Manual シウクシュ Footer_Forums ーヤステニヌ Footer_FeedMe ア篌ホ Footer_RequestFeature ア箒ノソ菘サ Footer_MailingList グタマクオ クョスコニョ Configuration_Error1 アクコミアロタレエツ ケンオ蠖テ 1アロタレソゥセ゚ ヌユエマエル. Configuration_Error2 サ鄙タレ タホナヘニ菎フスコタヌ ニニョエツ ケンオ蠖テ 1コホナヘ 65535 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Configuration_Error3 POP3 ニニョエツ ケンオ蠖テ 1コホナヘ 65535 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Configuration_Error4 ニ菎フチ ナゥア箒ツ ケンオ蠖テ 1コホナヘ 1000 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Configuration_Error5 ネスコナ荳ョタヌ コクチク ア箍」タコ ケンオ蠖テ 1コホナヘ 366 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Configuration_Error6 TCP ナクタモセニソタコ ケンオ蠖テ 10コホナヘ 1800 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. The TCP timeout must be a number between 10 and 1800 Configuration_Error7 XML RPC クョスシ ニニョエツ ケンオ蠖テ 1コホナヘ 65535 サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Configuration_POP3Port POP3 ニニョ Configuration_POP3Update %sキホ ニニョクヲ コッー貮゚スタエマエル. タフーヘタコ ニヒニトタマタサ タ鄂テタロヌマア タアチエツ タソオヌチ セハスタエマエル. Configuration_XMLRPCUpdate XML-RPC ニニョクヲ %s キホ ー貎ナヌマソエスタエマエル. タフーヘタコ ニヒニトタマタサ タ邀箏ソヌマソゥセ゚ タソオヒエマエル. Configuration_XMLRPCPort XML-RPC クョスシ ニニョ Configuration_SMTPPort SMTP クョスシ ニニョ Configuration_SMTPUpdate SMTP ニニョクヲ %sキホ ー貎ナヌマソエスタエマエル. タフーヘタコ ニヒニトタマタサ タ鄂テタロヌマア タアチエツ タソオヌチ セハスタエマエル. Configuration_NNTPPort NNTP クョスシ ニニョ Configuration_NNTPUpdate NNTP クョスシ ニニョクヲ %sキホ ー貎ナヌマソエスタエマエル. タフーヘタコ ニヒニトタマタサ タ鄂テタロヌマア タアチエツ タソオヌチ セハスタエマエル. Configuration_POPFork POP3 オソステ ソャー ヌ譱 Configuration_SMTPFork SMTP オソステ ソャー ヌ譱 Configuration_NNTPFork NNTP オソステ ソャー ヌ譱 Configuration_POP3Separator POP3 host:port:user アクコミアロタレ Configuration_NNTPSeparator NNTP host:port:user アクコミアロタレ Configuration_POP3SepUpdate POP3 アクコミアロタレクヲ %sキホ ー貎ナヌマソエスタエマエル. Configuration_NNTPSepUpdate NNTP アクコミアロタレクヲ %sキホ ー貎ナヌマソエスタエマエル. Configuration_UI サ鄙タレ タホナヘニ菎フスコ タ・ ニニョ Configuration_UIUpdate サ鄙タレ タホナヘニ菎フスコ タ・ ニニョクヲ %sキホ コッー貮゚スタエマエル. ニヒニトタマタサ タ鄂テタロヌマア タアチエツ タソオヌチ セハスタエマエル. Configuration_History ニ菎フチエ タフグタマ ーケシ Configuration_HistoryUpdate ニ菎フチエ タフグタマ ーケシクヲ %sキホ コッー貮゚スタエマエル. Configuration_Days ネスコナ荳ョソ。 ウイーワオム ア箍」(タマ) Configuration_DaysUpdate ネスコナ荳ョソ。 ウイーワオム ア箍」(タマ)タサ %sキホ コッー貮゚スタエマエル. Configuration_UserInterface サ鄙タレ タホナヘニ菎フスコ Configuration_Skins スコナイ Configuration_SkinsChoose スコナイ シアナテ Configuration_Language セセ Configuration_LanguageChoose セセ シアナテ Configuration_ListenPorts クョスシ ニニョ Configuration_HistoryView ネスコナ荳ョ コクア Configuration_TCPTimeout TCP トチウリシヌ ナクタモセニソ Configuration_TCPTimeoutSecs TCP トチウリシヌ ナクタモセニソ(テハ) Configuration_TCPTimeoutUpdate TCP トチウリシヌ ナクタモセニソタサ %sキホ コッー貮マソエスタエマエル. Configuration_ClassificationInsertion タフグタマ ケョタレソュ サタヤ Configuration_SubjectLine チヲク ケルイ゙ Configuration_XTCInsertion X-Text-Classification ヌエ Configuration_XPLInsertion X-POPFile-Link ヌエ Configuration_Logging キホア Configuration_None セタス Configuration_ToScreen ネュク鯊クキホ Configuration_ToFile ニトタマキホ Configuration_ToScreenFile ネュク魏 ニトタマキホ Configuration_LoggerOutput キホアラ テ箙ツ Configuration_GeneralSkins スコナイ Configuration_SmallSkins タロタコ スコナイ Configuration_TinySkins セニチヨ タロタコ スコナイ Configuration_CurrentLogFile <ヌタ キホアラ ニトタマ> Advanced_Error1 '%s' エツ タフケフ ケォステオヌエツ エワセキホ オキマオネ オ Advanced_Error2 ケォステオヌエツ エワセエツ セヒニトコェ, シタレ,., _, -, カヌエツ @ ククタサ セオ シ タヨスタエマエル. Advanced_Error3 '%s' ー。 ケォステオヌエツ エワセ クキマソ。 テ゚ー。オヌセスタエマエル. Advanced_Error4 '%s' エツ ケォステオヌエツ エワセ クキマソ。 セスタエマエル. Advanced_Error5 '%s' ー。 ケォステオヌエツ エワセ クキマソ。シュ チヲーナオヌセスタエマエル Advanced_StopWords ケォステオヌエツ エワセオ Advanced_Message1 ニヒニトタマタコ エルタスタヌ タレチヨ サ鄙オヌエツ エワセクヲ ケォステヌユエマエル: Advanced_AddWord エワセ テ゚ー。 Advanced_RemoveWord エワセ チヲーナ Advanced_AllParameters クオ ニヒニトタマ ニトカケフナヘ Advanced_Parameter ニトカケフナヘ Advanced_Value ーェ Advanced_Warning タフーヘタコ ニヒニトタマタヌ クオ ニトカケフナヘタヤエマエル. ーア゙サ鄙タレソタヤエマエル. セエタ ヌラクタフオ コッー貮メ シ タヨタクク コッー ネトソ。 ー貎ナ ケニータサ エゥク」スハステソタ. チヲエキホ コッー貮゚エツー。ソ。 エヌム ーヒサ邏ツ チヲーオヌチ セハスタエマエル. History_Filter  (エルタス ケナカククタサ コクタモ:%s) History_FilterBy ーノキッウセ ア簔リ History_Search  (ケ゚スナ/チヲクタクキホ ーヒサ: %s) History_Title テヨアル グタマ History_Jump グタマキホ ー。ア History_ShowAll クオホ コクタモ History_ShouldBe クツエツ コミキ History_NoFrom ケ゚スナタレ セタス History_NoSubject チヲク セタス History_ClassifyAs エルタスタクキホ コミキヌヤ: History_MagnetUsed サ鄙オネ タレショ History_MagnetBecause タレショ サ鄙オハ

%s(タク)キホ コミキオハ. タレショ %s カァケョタモ.

History_ChangedTo エルタスタクキホ コッー豬ハ:%s History_Already ヌタ コミキ:%s History_RemoveAll クオホ チヲーナ History_RemovePage ヌタ コクタフエツ クキマクク チヲーナ History_Remove ネスコナ荳ョキホコホナヘ チヲーナヌマア タァヌリシュエツ ナャクッヌマスハステソタ History_SearchMessage ケ゚スナ/チヲクタクキホコホナヘ ーヒサ History_NoMessages グタマ セタス History_ShowMagnet タレショタクキホ コミキオハ History_ShowNoMagnet タレショタクキホ コミキオヌチ セハタス History_Magnet  (タレショタクキホ コミキオネ ーヘクク コクタモ) History_NoMagnet  (タレショタクキホ コミキオヌチ セハタコ ーヘクク コクタモ) History_ResetSearch テハア篳ュ Password_Title コケミケネ」 Password_Enter コケミケネ」 タヤキツ Password_Go ステタロ Password_Error1 タ゚クオネ コケミケネ」 Security_Error1 コクセネニニョエツ ケンオ蠖テ 1コホナヘ 65535サ鄲フタヌ シタレソゥセ゚ ヌユエマエル. Security_Stealth スコナレスコ クオ / シュケ オソタロ Security_NoStealthMode セニエマソタ (スコナレスコ クオ) Security_ExplainStats (タフーヘタフ トムチク ニヒニトタマタコ ヌマキ鄙。 ヌムケセソ エルタスタヌ シシー。チ ーェタサ getpopfile.orgソ。 コクウタエマエル - bc (ククオ蠖ナ ケナカ シ), mc (ニヒニトタマタフ コミキヌム グステチ シ) and ec (コミキ ソタキ ーヌシ). タフーヘオ鯊コ ニトタマキホ タタ蠏ヌク ニヒニトタマタフ セカサーヤ サ鄙オヌク セクカウェ タ゚ タロオソヌマエツチソ。 ーヌム ナー雕ヲ ーヌ・ヌメカァ サ鄙オヒエマエル. チヲ タ・シュケエツ 5タマー」 キホアラニトタマタサ コクチクヌマー アラ ネト サ霖ヲヌユエマエル. ーウーウタヌ IPチヨシメソヘ ナー ー」ソ。 セカーヌム ソャーーー襍オ タタ蠏ヌチ セハスタエマエル.) Security_ExplainUpdate (タフーヘタフ トムチク ニヒニトタマタコ ヌマキ鄙。 ヌムケセソ エルタスタヌ シシー。チ ーェタサ getpopfile.orgソ。 コクウタエマエル - ma (シウト。ヌマスナ ニヒニトタマタヌ グタフタ ケタ ケネ」), mi (シウト。ヌマスナ ニヒニトタマタヌ クカタフウハ ケタ ケネ」), bn (シウト。ヌマスナ ニヒニトタマタヌ コオ ケネ」). ニヒニトタマタコ サ ケタタフ タヨタクク ニ菎フチ クヌ タァツハソ。 アラキ。ヌネ ヌナツキホ アラ ー皺クヲ ヌ・ステヌユエマエル. チヲ タ・シュケエツ 5タマー」 キホアラニトタマタサ コクチクヌマー アラ ネト サ霖ヲヌユエマエル. ーウーウタヌ IPチヨシメソヘ セオ・タフニョ テシナゥ ー」ソ。 セカーヌム ソャーーー襍オ タタ蠏ヌチ セハスタエマエル.) Security_PasswordTitle サ鄙タレ タホナヘニ菎フスコ コケミケネ」 Security_Password コケミケネ」 Security_PasswordUpdate コケミケネ」クヲ %sキホ コッー貮゚スタエマエル. Security_AUTHTitle コクセネ ニミスコソオ タホチ Security_SecureServer コクセネ シュケ Security_SecureServerUpdate コクセネ シュケクヲ %sキホ コッー貮゚スタエマエル. ニヒニトタマタサ エルステ ステタロヌメカァ タソオヒエマエル. Security_SecurePort コクセネ ニニョ Security_SecurePortUpdate ニニョクヲ %sキホ コッー貮゚スタエマエル. ニヒニトタマタサ エルステ ステタロヌメカァ タソオヒエマエル. Security_SMTPServer SMTP テシタホ シュケ Security_SMTPServerUpdate SMTP テシタホ シュケクヲ %sキホ コッー貮゚スタエマエル. ニヒニトタマタサ エルステ ステタロヌメカァ タソオヒエマエル. Security_SMTPPort SMTP テシタホ ニニョ Security_SMTPPortUpdate SMTP テシタホ ニニョクヲ %sキホ コッー貮゚スタエマエル. ニヒニトタマタサ エルステ ステタロヌメカァ タソオヒエマエル. Security_POP3 ソーン ア箍霍ホコホナヘタヌ POP3 ソャー眤サ ヌ譱(ニヒニトタマ タ鄂テタロ ヌハソ) Security_SMTP ソーン ア箍霍ホコホナヘタヌ SMTP ソャー眤サ ヌ譱(ニヒニトタマ タ鄂テタロ ヌハソ) Security_NNTP ソーン ア箍霍ホコホナヘタヌ NNTP ソャー眤サ ヌ譱(ニヒニトタマ タ鄂テタロ ヌハソ) Security_UI ソーン ア箍霍ホコホナヘタヌ HTTP (タッタ タホナヘニ菎フスコ ネュク) ソャー眤サ ヌ譱(ニヒニトタマ タ鄂テタロ ヌハソ) Security_XMLRPC ソーン ア箍霍ホコホナヘタヌ XML-RPC ソャー眤サ ヌ譱(ニヒニトタマ タ鄂テタロ ヌハソ) Security_UpdateTitle タレオソ セオ・タフニョ テシナゥ Security_Update ニヒニトタマ テヨスナ ケタタサ クナタマ テシナゥヌヤ Security_StatsTitle ナー コクー Security_Stats クナタマ ナー雕ヲ コクウソ Magnet_Error1 タレショ '%s' エツ タフケフ ケナカ '%s'ソ。 チクタ酩ユエマエル. Magnet_Error2 サ タレショ '%s' エツ '%s' タレショー テ豬ケヌヤ(ケナカ:'%s'). オカシュ ネ・オソタヌ ソキチー。 タヨタクケヌキホ サ タレショタコ テ゚ー。オヌチ セハセメスタエマエル. Magnet_Error3 サ タレショタホ '%s' タサ ケナカ '%s' ソ。 サシコ Magnet_CurrentMagnets ヌタ タレショ Magnet_Message1 エルタス タレショタコ チチ、オネ ケナカタクキホ グタマタフ ヌラサ コミキオヌオオキマ ヌユエマエル. Magnet_CreateNew サ タレショ サシコ Magnet_Explanation シシ チセキタヌ タレショタフ ー。エノヌユエマエル:
  • ケ゚スナチヨシメ カヌエツ タフクァ: ソケ: john@company.com (ニッチ、 タフグタマ チヨシメキホ),
    company.com (company.comソ。シュ コクウサエツ クオ グタマ),
    John Doe:Jonh Doeクク タマト。, John:テケエワセー。 Johnタフク クオホ タマト。
  • シスナタレ グタマチヨシメ カヌエツ タフクァ: ケ゚スナチヨシメソ タレショー オソタマヌマウェ シスナタレソ。 タロソヌヤ
  • チヲクタヌ エワセ: ソケ)セネウ酩マシシソ エツ チヲクカタヌ クオ セネウ酩マシシソ ソヘ タマト。
Magnet_MagnetType タレショ チセキ Magnet_Value ーェ Magnet_Always ヌラサ エルタス ケナカタクキホ Magnet_Jump タレショ ニ菎フチキホ Bucket_Error1 ソオセ シメケョタレソヘ - ソヘ _ククタサ サ鄙ヌマスヌ シ タヨスタエマエル. Bucket_Error2 %s(タフ)カエツ タフクァタヌ ケナカタコ タフケフ タヨスタエマエル. Bucket_Error3 %s(タフ)カエツ タフクァタクキホ ケナカタサ サシコ Bucket_Error4 ーケ鯊フ セニエム エワセクヲ タヤキツヌマスハステソタ. Bucket_Error5 %s ケナカタサ %s キホ コッー貮マソエスタエマエル. Bucket_Error6 サ霖ヲオネ ケナカ %s Bucket_Title ソ萓 Bucket_BucketName ケナカ タフクァ Bucket_WordCount エワセ シ Bucket_WordCounts エワセ シ Bucket_UniqueWords タッタマヌム エワセ Bucket_SubjectModification チヲク コッー Bucket_ChangeColor ササ コッー Bucket_NotEnoughData オ・タフナヘー。 テ貅ミト。 セハタス Bucket_ClassificationAccuracy コミキ チ、ネョオオ Bucket_EmailsClassified コミキオネ タフグタマ Bucket_EmailsClassifiedUpper コミキオネ タフグタマ Bucket_ClassificationErrors コミキ ソタキ Bucket_Accuracy チ、ネョオオ Bucket_ClassificationCount コミキ シ Bucket_ClassificationFP タ゚ク ニヌヤステナエ Bucket_ClassificationFN タ゚ク チヲソワステナエ Bucket_ResetStatistics ナー テハア篳ュ Bucket_LastReset クカチクキ テハア篳ュ Bucket_CurrentColor %sタヌ ヌタ ササタコ %sタヤエマエル. Bucket_SetColorTo %sタヌ ササタサ %sタクキホ シウチ、 Bucket_Maintenance タッチ コクシ Bucket_CreateBucket エルタス タフクァタヌ ケナカ サシコ Bucket_DeleteBucket エルタス タフクァタヌ ケナカ サ霖ヲ Bucket_RenameBucket エルタス タフクァタヌ ケナカ タフクァ コッー Bucket_Lookup ーヒサ Bucket_LookupMessage ケナカソ。シュ エルタス エワセクヲ ーヒサ Bucket_LookupMessage2 エルタス エワセソ。 エヌム ーヒサ ー皺 Bucket_LookupMostLikely %s エツ %sソ。 ウェナクウッ ネョキタフ ー。タ ウスタエマエル. Bucket_DoesNotAppear

%s エツ セエタ ケナカソ。オオ ウェナクウェチ セハスタエマエル. Bucket_DisabledGlobally タソセネヌヤ Bucket_To => Bucket_Quarantine ーンクョ SingleBucket_Title %sタヌ サシシウサソ SingleBucket_WordCount ケナカ エワセ シ SingleBucket_TotalWordCount タテシ エワセ シ SingleBucket_Percentage タテシタヌ コタイ SingleBucket_WordTable %sタヌ エワセ ヌ・ SingleBucket_Message1 コーヌ・ コルタコ(*) エワセオ鯊コ タフケ ニヒニトタマ シシシヌソ。シュ コミキソ。 サ鄙オヌセスタエマエル. エワセクヲ ナャクッヌマステク ケナカソ。 ニヌヤオノ ネョキタサ ネュク セニキ。 ソタク・ツハソ。シュ コクスヌ シ タヨスタエマエル. SingleBucket_Unique %s : タッタマ SingleBucket_ClearBucket クオ エワセ チヲーナ Session_Title ニヒニトタマ シシシヌタフ ククキ盞ヌセスタエマエル. Session_Error ニヒニトタマ シシシヌタフ ククキ盞ヌセスタエマエル. ニヒニトタマタサ チセキ ネト タ鄂テタロ ヌ゚ア カァケョタマ ーヘタフク, タァタヌ クオナゥ チ゚ ヌマウェクヲ エゥク」ステク ー霈モヌマスヌ シ タヨスタエマエル. View_Title グタマ タレシシネ コクア View_ShowFrequencies エワセ コオオ コクア View_ShowProbabilities エワセ ネョキ コクア View_ShowScores エワセ チ。シ コクア View_WordMatrix エワセ ヌ・ View_WordProbabilities エワセ ネョキ ヌ・ステ チ゚ View_WordFrequencies エワセ コオオ ヌ・ステ チ゚ View_WordScores エワセ チ。シ ヌ・ステ チ゚ Windows_TrayIcon ニヒニトタマ セニタフトワタサ タゥオオソチ ステスコナロ ニョキケタフソ。 ヌ・ステヌマステーレスタエマア? Windows_Console ニヒニトタマ グステチクヲ トワシヨテ「ソ。 ヌ・ステヌマステーレスタエマア? Windows_NextTime

タフ コッー貘コ エルタスケ ニヒニトタマ スヌヌ狄テコホナヘ タソオヒエマエル. Header_MenuSummary タフーヘタコ チヲセシセナヘタヌ ー「ア エルク・ ニ菎フチクヲ チ「アルヌメ シ タヨエツ グエコタヤエマエル. History_MainTableSummary タフーヘタコ テヨアル シスナオネ グタマタヌ ケ゚スナタホー チヲクタサ コクソゥチヨク タ邁ヒナ萇マー タ郤ミキヌメ シ タヨオオキマ ヌリチヨエツ グエコタヤエマエル. チヲク カタホタサ ナャクッヌマステク グタマ ウサソタサ コクスヌ シ タヨタクク セニソキッ, コミキー。 オネ タフタックヲ コクスヌ シ タヨスタエマエル. クツエツ コミキ トュソ。シュエツ グタマタフ セエタ ケナカソ。 シモヌマエツチ チチ、ヌマステーナウェ コミキクヲ テシメヌマスヌ シ タヨスタエマエル. 'サ霖ヲ' トュソ。シュエツ ニッチ、 グステチクヲ ネスコナ荳ョキホコホナヘ チソ シ タヨスタエマエル. History_OpenMessageSummary タフーヘタコ タフグタマタヌ コサケョタサ エ羃 タヨタクク, コミキソ。 サ鄙オネ エワセー。 ー。タ ーキテウタコ ケナカソ。 オカ ヌマタフカタフニョオヌセ タヨスタエマエル. Bucket_MainTableSummary タフーヘタコ コミキ ケナカソ。 エヌム ーウータサ チヲーヌユエマエル. ー「 ヌ狢コ ケナカク, ケナカタヌ テム エワセ シ, ー「 ケナカソ。 シモヌム ーウコー エワセ シ, グタマタフ コミキ オヌセタサカァ チヲクタフ コッー オヌセエツチ ソゥコホ, グタマタサ アラ ケナカタクキホ ーンクョ ステナウ ーヘタホチ ソゥコホ, アラクョー ケナカー ーキテオネ サ酩ラタサ ヌ・ステヌメ サアタサ ークヲ シ タヨエツ ヌ・キホ アクシコオヌセ タヨスタエマエル. Bucket_StatisticsTableSummary タフーヘタコ ニヒニトタマタヌ タケンタタホ シコエノソ。 ーヌム シシ チセキタヌ ナー雕ヲ チヲーヌユエマエル. 1. コミキー。 セクカウェ チ、ネョヌムー。, 2. セクカウェ クケタコ グタマタフ, セエタ ケナカソ。 コミキオヌセエツー。, 3. セクカウェ クケタコ エワセー。 ー「 ケナカソ。 シモヌマク, アラオ鯊ヌ サエタタホ ニロシセニョ コタイタフ セカサーヤ オヌエツー。. Bucket_MaintenanceTableSummary タフーヘタコ ケナカタヌ サシコ/サ霖ヲ/コッー ヌメシ タヨエツ ニ菎フチクヲ チヲーヌマク サエタタホ ネョキコクア タァヌリ クオ ケナカソ。 エ羈 エワセクヲ ーヒサヌマエツ グエコタヤエマエル. Bucket_AccuracyChartSummary タフーヘタコ タフグタマ コミキタヌ チ、ネョオオクヲ アラキ。ヌネタクキホ ヌ・ステヌユエマエル. Bucket_BarChartSummary タフーヘタコ ー「ー「タヌ ケナカソ。 エヌム ヌメエ コタイ(ニロシセニョ)クヲ アラキ。ヌネタクキホ ヌ・ステヌユエマエル. タフーヘタコ コミキオネ グタマタヌ シソヘ テム エワセ シソ。 クオホ サ鄙オヒエマエル. Bucket_LookupResultsSummary タフーヘタコ トレニロスコ(エワセチ)タヌ エワセー。 ー。チエツ ネョキタサ コクソゥチンエマエル. ー「ー「タヌ ケナカソ。 エヌリ, エワセ テ簓 コオオソヘ アラ ケナカソ。 ニヌヤオノ ネョキ, アラクョー アラ エワセー。 グタマソ。 チクタ酩メ ー豼 ケナカ チ。シソ。 ケフト。エツ タケンタタホ ソオヌ簑サ コクソゥチンエマエル. Bucket_WordListTableSummary タフーヘタコ ニッチ、 ケナカソ。 エヌム クオ エワセクヲ ー「 ヌ狢ヌ テケ エワセキホ チ、キトヌマソゥ ウェソュヌユエマエル. Magnet_MainTableSummary タフーヘタコ ーチ、オネ エワセソ。 オカ タレオソタタクキホ グタマタサ コミキヌマア タァヌム タレショオ鯊サ コクソゥチンエマエル. ー「 チルタコ セカサーヤ タレショタフ チ、タヌオヌセ タヨエツチ, セエタ ケナカソ。 ウヨタサ ーヘタホチ, アラクョー タレショタサ チソ ケニータサ コクソゥチンエマエル. Configuration_MainTableSummary タフーヘタコ ニヒニトタマタヌ シウチ、タサ チカタヌマア タァヌム ソゥキッ ニタクキホ アクシコオヒエマエル. Configuration_InsertionTableSummary タフーヘタコ タフグタマ ヌチキホアラキ・(セニソキ オオ)ソ。 グタマタサ ウムーワチヨア タソ。 ヌエウェ チヲクカタサ コッー貮メ ーヘタホチ シウチ、ヌメ ケニータサ コクソゥチンエマエル. Security_MainTableSummary タフーヘタコ ニヒニトタマタヌ タテシ アクシコタヌ コクセネソ。 ソオヌ簑サ チヨエツ チヲセ ヌラクタサ チヲーヌユエマエル. チ, タレオソタタクキホ セオ・タフニョクヲ テシナゥヌメ ーヘタホー。, ーウケ゚ソ。 ツーヌマア タァヌリ ニヒニトタマタヌ シコエノソ。 エヌム ナー雕ヲ ヌチキホアラキ・ チヲタロタレタヌ タ・サ鄲フニョキホ タシロヌメ ーヘタホー。クヲ チ、ヌメ シ タヨスタエマエル. Advanced_MainTableSummary タフーヘタコ ニヒニトタマタフ グタマタサ コミキヌメカァ ケォステヌマエツ エワセ(ウハケォ ネ酩ム エワセ) クキマタサ チヲーヌユエマエル. エワセオ鯊コ テケ アロタレソ。 タヌヌリ チ、キトオヌセ タヨスタエマエル. popfile-1.1.3+dfsg/languages/Italiano.msg0000664000175000017500000007270411624177330017601 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Italian translation thanks to Roberto Inzerillo # Additional Italian contribution (sep-2004) by Paolo De Felice # Identify the language and character set used for the interface LanguageCode it LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply Applica On Attivato Off Disattivato TurnOn Attiva TurnOff Disattiva Add Aggiungi Remove Rimuovi Previous Precedente Next Successivo From Mittente Subject Oggetto Cc Cc Classification Classificazione Reclassify Riclassifica Probability Probabilità Scores Punteggi QuickMagnets QuickMagnets Undo Annulla Close Chiudi Find Cerca Filter Filtro Yes Si No No ChangeToYes Cambia in Si ChangeToNo Cambia in No Bucket Cesto Magnet Magnete Delete Cancella Create Crea To Destinatario Total Totale Rename Rinomina Frequency Frequenza Probability Probabilità Score Punteggio Lookup Analisi Word Parola Count Conteggio Update Aggiorna Refresh Ricarica Arrived Ricevuto FAQ FAQ ID ID Date Data Size Dimensione # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands . Locale_Decimal , # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title Centro di Controllo di POPFile Header_Shutdown Spegni POPFile Header_History Storico Header_Buckets Cesti Header_Configuration Configurazione Header_Advanced Avanzate Header_Security Sicurezza Header_Magnets Magneti Footer_HomePage Home Page di POPFile Footer_Manual Manuale Footer_Forums Forum di discussione Footer_FeedMe Donazioni Footer_RequestFeature Richiedi nuove caratteristiche Footer_MailingList Mailing List Footer_Wiki Documentazione Configuration_Error1 Il carattere di separazione deve essere un solo carattere Configuration_Error2 La porta per l'interfaccia utente deve essere un numero compreso tra 1 e 65535 Configuration_Error3 La porta per il POP3 deve essere un numero compreso tra 1 e 65535 Configuration_Error4 La dimensione della pagina deve essere un numero compreso tra 1 e 1000 Configuration_Error5 Il numero di giorni nello storico deve essere un numero tra 1 e 366 Configuration_Error6 Il timeout TCP deve essere un numero tra 10 e 1800 Configuration_Error7 La porta per l'XML-RPC deve essere un numero compreso tra 1 e 65535 Configuration_Error8 La porta proxy SOCKS V deve essere un numero compreso tra 1 e 65535 Configuration_POP3Port Porta POP3 Configuration_POP3Update Porta POP3 impostata a %s; questo cambiamento avrà effetto dopo il riavvio POPFile Configuration_XMLRPCUpdate Porta XML-RPC impostata a %s; questo cambiamento avrà effetto dopo il riavvio POPFile Configuration_XMLRPCPort Porta XML-RPC Configuration_SMTPPort Porta SMTP Configuration_SMTPUpdate Porta SMTP impostata a %s; questo cambiamento avrà effetto dopo il riavvio POPFile Configuration_NNTPPort Porta NNTP Configuration_NNTPUpdate Porta NNTP impostata a %s; questo cambiamento avrà effetto dopo il riavvio POPFile Configuration_POPFork Abilita connessioni POP3 contemporanee Configuration_SMTPFork Abilita connessioni SMTP contemporanee Configuration_NNTPFork Abilita connessioni NNTP contemporanee Configuration_POP3Separator Carattere di separazione per POP3 host:porta:utente Configuration_NNTPSeparator Carattere di separazione per NNTP host:porta:utente Configuration_POP3SepUpdate Separatore di POP3 impostatato a %s Configuration_NNTPSepUpdate Separatore di NNTP impostatato a %s Configuration_UI Porta dell'interfaccia utente web Configuration_UIUpdate Porta dell'interfaccia utente web impostata a %s; questo cambiamento avrà effetto dopo il riavvio di POPFile Configuration_History Numero di email per pagina Configuration_HistoryUpdate Numero di email per pagina impostato a %s Configuration_Days Numero di giorni dello storico da conservare Configuration_DaysUpdate Numero di giorni dello storico impostato a %s Configuration_UserInterface Interfaccia utente Configuration_Skins Aspetto Configuration_SkinsChoose Scegli l'aspetto Configuration_Language Lingua Configuration_LanguageChoose Scegli la lingua Configuration_ListenPorts Opzioni di modulo Configuration_HistoryView Vedi lo storico Configuration_TCPTimeout Timeout della connessione TCP Configuration_TCPTimeoutSecs Timeout della connessione TCP in secondi Configuration_TCPTimeoutUpdate Timeout della connessione TCP impostato a %s Configuration_ClassificationInsertion Inserimento di testo nell'E-Mail Configuration_SubjectLine Aggiungi classificazione all'Oggetto Configuration_XTCInsertion X-Text-Classification Header Configuration_XPLInsertion X-POPFile-Link Header Configuration_Logging Logging Configuration_None Nessuno Configuration_ToScreen A schermo Configuration_ToFile Su file Configuration_ToScreenFile A schermo e su file Configuration_LoggerOutput Output del logger Configuration_GeneralSkins Skin Configuration_SmallSkins Skin piccoli Configuration_TinySkins Skin minuscoli Configuration_CurrentLogFile <log file corrente> Configuration_SOCKSServer Host proxy SOCKS V Configuration_SOCKSPort Porta proxy SOCKS V Configuration_SOCKSPortUpdate Porta proxy SOCKS V impostata a %s Configuration_SOCKSServerUpdate Host proxy SOCKS V impostato a %s Configuration_Fields Colonne dello storico Advanced_Error1 '%s' è già nella lista delle parole ignorate Advanced_Error2 Le parole da ignorare possono contenere solo caratteri alfanumerici, ., _, -, o il carattere @ Advanced_Error3 '%s' aggiunto alla lista di parole ignorate Advanced_Error4 '%s' non è nella lista delle parole ignorate Advanced_Error5 '%s' rimosso dalla lista delle parole ignorate Advanced_StopWords Parole ignorate Advanced_Message1 POPFile ignora le seguenti parole di uso comune: Advanced_AddWord Aggiungi parola Advanced_RemoveWord Rimuovi parola Advanced_AllParameters Tutti i parametri di POPFile Advanced_Parameter Parametri Advanced_Value Valore Advanced_Warning Questa è la lista completa dei parametri di POPFile. Solo per utenti esperti: puoi modificarli tutti e cliccare su Aggiorna; non c'è alcun controllo sulla loro validità. Advanced_ConfigFile file di configurazione: History_Filter  (mostro solo il cesto %s) History_FilterBy Filtra per History_Search  (ricerca di %s nel Mittente/Oggetto) History_Title Messaggi recenti History_Jump Salta al messaggio History_ShowAll Mostra tutti History_ShouldBe Dovrebbe essere History_NoFrom Mittente assente History_NoSubject Oggetto assente History_ClassifyAs Classifica come History_MagnetUsed Magnete usato History_MagnetBecause Magnete usato

Classificato come %s a causa del magnete %s

History_ChangedTo Cambiato in %s History_Already Già riclassificato come %s History_RemoveAll Rimuovi tutti History_RemovePage Rimuovi pagina History_Remove Per rimuovere le voci nello storico clicca History_SearchMessage cerca Mittente/Oggetto History_NoMessages Nessun messaggio History_ShowMagnet magnetizza History_Magnet  (mostro solo i messaggi classificati per magnetismo) History_NoMagnet  (mostro solo i messaggi non classificati per magnetismo) History_ResetSearch Resetta History_Automatic Automatico History_ChangedClass Sarà riclassificato come History_Column_Characters Cambia larghezza delle colonne Da, A, Cc e Oggetto History_Increase Incrementa History_Decrease Decrementa History_Negate_Search Inverti cerca/filtro History_Purge Elimina ora History_Reclassified Riclassificato History_RemoveChecked Rimuovi attivato History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Password Password_Enter Inserisci la password Password_Go Vai! Password_Error1 Password non corretta Security_Error1 La porta sicura deve essere un numero tra 1 e 65535 Security_Stealth Modalità stealth/Server Operation Security_NoStealthMode No (Modalità Stealth) Security_StealthMode (Modalità Stealth) Security_ExplainStats (Attivando questo flag POPFile spedisce una volta al giorno i seguenti tre valori ad uno script su getpopfile.org: bc (il numero totale di cesti che hai), mc (il numero totale di messaggi che POPFile ha classificato) ed ec (il numero totale di errori di classificazione). Questi valori vengono conservati in un file e ne farò uso per pubblicare delle statistiche su come la gente usa POPFile e su come funziona. Il mio server web conserva questi file di log per circa 5 giorni e poi vengono cancellati; non traccio alcuna connessione tra le statistiche e gli IP individuali.) Security_ExplainUpdate (Attivando questo flag POPFile spedisce una volta al giorno i seguenti tre valori ad uno script su getpopfile.org: ma (il major version number del POPFile che hai installato), mi (il minor version number del POPFile che hai installato) e bn (il build number del POPFile che hai installato). POPFile ne ottiene una risposta nella forma di un grafico che appare nella parte alta della pagina allorquando una nuova versione si renda disponibile. Il mio server web conserva questi file di log per circa 5 giorni e poi vengono cancellati; non conservo alcun dato sulla connessione tra i controlli di aggiornamenti e gli IP individuali.) Security_PasswordTitle Password dell'Interfaccia Utente Security_Password Password Security_PasswordUpdate Password modifica in %s Security_AUTHTitle Autenticazione sicura con password/AUTH Security_SecureServer Server sicuro Security_SecureServerUpdate Server sicuro impostato a %s; questo cambiamento avrà effetto dopo il riavvio POPFile Security_SecurePort Porta sicura Security_SecurePortUpdate Porta impostata a %s; questo cambiamento avrà effetto solo dopo aver riavviato POPFile Security_SMTPServer Server SMTP concatenato Security_SMTPServerUpdate Server SMTP concatenato impostato a %s; questo cambiamento avrà effetto solo dopo aver riavviato POPFile Security_SMTPPort porta SMTP concatenata Security_SMTPPortUpdate porta SMTP concatenata impostata a %s; questo cambiamento avrà effetto solo dopo aver riavviato POPFile Security_POP3 Accetta connessioni POP3 da computer remoti (è necessario riavviare POPFile) Security_SMTP Accetta connessioni SMTP da computer remoti (è necessario riavviare POPFile) Security_NNTP Accetta connessioni NNTP da computer remoti (è necessario riavviare POPFile) Security_UI Accetta connessioni HTTP (Interfaccia Utente) da computer remoti (è necessario riavviare POPFile) Security_XMLRPC Accetta connessioni XML-RPC da computer remoti (è necessario riavviare POPFile) Security_UpdateTitle Verifica automatica degli aggiornamenti Security_Update Verifica quotidianamente se esistono aggiornamenti di POPFile Security_StatsTitle Spedizione delle statistiche Security_Stats Spedisci quotidianamente le statistiche Magnet_Error1 Il magnete '%s' esiste già nel cesto '%s' Magnet_Error2 Il nuovo magnete '%s' contrasta con il magnete '%s' nel cesto '%s' e può risultati ambigui. Il nuovo magnete non è stato aggiunto. Magnet_Error3 Creato il nuovo magnete '%s' per il cesto '%s' Magnet_CurrentMagnets Magneti correnti Magnet_Message1 I magneti che seguono fanno sì che l'email venga sempre classificata nel cesto specificato. Magnet_CreateNew Crea un nuovo magnete Magnet_Explanation Sono disponibili i seguenti tipi di magnete:
  • Indirizzo o nome del Mittente: Ad es.: john@company.com per individuare un indirizzo specifico,
    company.com per individuare chiunque spedisca dal dominio company.com,
    John Doe per individuare una persona specifica, John per individuare tutti i John
  • Indirizzo o nome di un Destinatario/Cc: Funziona come il magnete sul Mittente ma con l'indirizzo del Destinatario/Cc
  • Parole nell'Oggetto: Ad es.: ciao per individuare tutti i messaggi con la parola ciao nell'oggetto
Magnet_MagnetType Tipo di magnete Magnet_Value Valore Magnet_Always Va sempre nel cesto Magnet_Jump Vai alla pagina dei magneti Bucket_Error1 I nomi dei cesti possono contenere solo lettere minuscole dalla a alla z ed i segni - e _ Bucket_Error2 Esiste già un cesto di nome %s Bucket_Error3 È stato creato un cesto di nome %s Bucket_Error4 Inserisci una parola di almeno una lettera Bucket_Error5 Cesto %s rinominato in %s Bucket_Error6 Cesto %s cancellato Bucket_Title Sommario Bucket_BucketName Nome del cesto Bucket_WordCount Numero di parole Bucket_WordCounts Conteggio delle parole Bucket_UniqueWords Parole uniche Bucket_SubjectModification Aggiungi classificazione all'Oggetto Bucket_ChangeColor Cambia il colore Bucket_NotEnoughData Dati non sufficienti Bucket_ClassificationAccuracy Accuratezza della classificazione Bucket_EmailsClassified Email classificate Bucket_EmailsClassifiedUpper Email Classificate Bucket_ClassificationErrors Errori di classificazione Bucket_Accuracy Accuratezza Bucket_ClassificationCount Conteggio della classificazione Bucket_ClassificationFP Falsi Positivi Bucket_ClassificationFN Falsi Negativi Bucket_ResetStatistics Azzera le statistiche Bucket_LastReset Ultimo azzeramento Bucket_CurrentColor il colore corrente di %s è %s Bucket_SetColorTo Colora %s di %s Bucket_Maintenance Manutenzione Bucket_CreateBucket Crea un cesto di nome Bucket_DeleteBucket Elimina il cesto chiamato Bucket_RenameBucket Rinomina il cesto chiamato Bucket_Lookup Analisi Bucket_LookupMessage Parola da analizzare nei cesti Bucket_LookupMessage2 Risultato dell'analisi della parola Bucket_LookupMostLikely La parola %s generalmente appare in %s Bucket_DoesNotAppear

%s non appare in alcun cesto Bucket_DisabledGlobally Disabilitato globalmente Bucket_To in Bucket_Quarantine Quarantena SingleBucket_Title Dettagli di %s SingleBucket_WordCount Numero di parole nel cesto SingleBucket_TotalWordCount Numero totale di parole SingleBucket_Percentage Percentuale rispetto al totale SingleBucket_WordTable Tabella delle parole per %s SingleBucket_Message1 Le parole contrassegnate con l'asterisco (*) sono usate per la classificazione in questa sessione di POPFile. Clicca su una parola per vedere la sua probabilità rispetto a tutti i cesti. SingleBucket_Unique %s uniche SingleBucket_ClearBucket Rimuovi tutte le parole Session_Title Sessione POPFile chiusa Session_Error La tua sessione con POPFile è scaduta. Questo può accadere interrompendo e rieseguendo POPFile senza aver prima chiuso il browser web. Clicca su uno dei link di questa pagina per continuare ad usare POPFile. View_Title Mostra il singolo messaggio View_ShowFrequencies Mostra la frequenza della parola View_ShowProbabilities Mostra le probabilità della parola View_ShowScores Mostra i punteggi della parola View_WordMatrix Matrice delle parole View_WordProbabilities mostro le probabilità della parola View_WordFrequencies mostro le frequenze della parola View_WordScores mostro i punteggi della parola View_Chart Diagramma delle decisioni Windows_TrayIcon Mostrare l'icona di POPFile nel system tray di Windows? Windows_Console Eseguire POPFile in console? Windows_NextTime

Questa modifica avrà effetto solo dopo avere riavviato POPFile Header_MenuSummary Questa tabella è il menu di navigazione che consente l'accesso ad ogni pagina del centro di controllo. History_MainTableSummary Questa tabella mostra i mittenti e l'oggetto dei messaggi ricevuti di recente e permette di consultarli e di riclassificarli. Cliccando sull'oggetto viene mostrato l'intero testo del messaggio, insieme con altre informazioni sul perchè è stato classificato così. La colonna 'Dovrebbe essere' ti permette di specificare a quale cesto appartiene il messaggio oppure di annullare il cambiamento. La colonna 'Elimina' ti permette di cancellare un messaggio dallo storico allorquando non serva più. History_OpenMessageSummary Questa tabella contiene l'intero testo di un messaggio e mette in evidenza le parole che sono state usate per la classificazione in base al cesto che gli è più pertinente. Bucket_MainTableSummary Questa tabella fornisce un resoconto dei cesti per le classificazioni. Ogni riga mostra il nome del cesto, il numero totale di parole per quel cesto, il numero delle singole parole in ciascun cesto, se l'oggetto dell'email viene modificato al momento della classificazione in quel cesto, we il messaggio viene messo in quarantena in quel cesto e una tabella per scegliere il colore da usare per mostrare tutto ciò che è pertinente a quel cesto nel centro di controllo. Bucket_StatisticsTableSummary Questa tabella mette a disposizione tre gruppi di statistiche sulle performance generali di POPFile. La prima indicazione l'accuratezza della sua classificazione, la seconda indica quante email sono state classificate e verso quale cesto, la terza indica quante parole sono presenti in ciascun cesto e qual'è la loro percentuale relativa. Bucket_MaintenanceTableSummary Questa tabella contiene delle form che ti permettono di creare, cancellare, rinominare i cesti e cercare una parola in tutti i cesti per vedere la sua probabilità relativa. Bucket_AccuracyChartSummary Questa tabella rappresenta graficamente l'accuratezza della classificazione dell'email. Bucket_BarChartSummary Questa tabella rappresenta graficamente la distribuzione percentuale per ciascun cesto. Viene usata sia per il numero di email classificate che per il conteggio totale delle parole. Bucket_LookupResultsSummary Questa tabella mostra la probabilità associata a ciascuna parola del corpo. Mostra, per ogni cesto, la frequenza con cui ogni parola si presenta, la probabilità che la parola si presenti in quel cesto, e l'effetto finale sul punteggio del cesto allorquando quella parola esista nell'email. Bucket_WordListTableSummary Questa tabella fornisce un elenco di tutte le parole in un cesto in particolare, ordinate secondo la prima lettera per ogni riga. Magnet_MainTableSummary Questa tabella mostra l'elenco di magneti usati per classificare le email in base a delle regole fisse. Ogni riga mostra la definizione del magnete, a quale cesto è collegato ed un bottone per cancellarlo. Configuration_MainTableSummary Questa tabella contiene alcune form per controllare la configurazione di POPFile. Configuration_InsertionTableSummary Questa tabella contiene dei bottoni per determinare se applicare delle modifiche alla riga dell'oggetto dell'email prima di passarla al client di posta o no. Security_MainTableSummary Questa tabella rende disponibile un set di controlli che influiscono sulla sicurezza di tutta la configurazione di POPFile, per stabilire se si vuole verificare automaticamente la presenza di aggiornamenti al programma e se si vogliono spedire le statistiche sulle performance di POPFile al centro dati dell'autore del programma come informazioni generali. Advanced_MainTableSummary Questa tabella fornisce un elenco di parole che POPFile ignora al momento della classificazione delle email a causa della loro frequenza relativa nelle email in generale. Sono organizzate per righe in base alla prima lettera di ciascuna parola. Imap_Bucket2Folder Mail per il cesto %s va alla cartella Imap_MapError Non puoi mappare più di un cesto ad una singola cartella! Imap_Server hostname del server IMAP: Imap_ServerNameError Inserisci l'hostname del server! Imap_Port Porta del server IMAP: Imap_PortError Inserisci un numero di porta valido! Imap_Login Login dell'account IMAP: Imap_LoginError Inserisci uno username per il logim! Imap_Password Password per l'account IMAP: Imap_PasswordError Inserisci una password per il server! Imap_Expunge Elimina messaggi contrassegnati per la cancellazione dalle cartelle sotto controllo. Imap_Interval Intervallo di aggiornamento in secondi: Imap_IntervalError Inserisci un intervallo tra 10 e 3600 secondi. Imap_Bytelimit Byte per messaggio da usare per la classificazione. Inserisci 0 (Null) per il messaggio completo: Imap_BytelimitError Inserisci un numero. Imap_RefreshFolders Aggiorna lista delle cartelle Imap_Now ora! Imap_UpdateError1 Login non riuscito. Verifica il nome per il login e la password. Imap_UpdateError2 Connessione al server fallita. Controlla il nome dell'host e la porta ed assicurati di essere online. Imap_UpdateError3 Configura prima i dettagli di connessione. Imap_NoConnectionMessage Configura prima i dettagli di connessione. Fatto ciò, questa pagina mostrer altre opzioni. Imap_WatchMore una cartella ad una lista di cartelle sotto controllo Imap_WatchedFolder Sotto controllo cartella numero Shutdown_Message POPFile è stato disattivato Help_Training Quando usi POPFile per la prima volta, non sa niente e necessita di addestramento. POPFile ha bisogno di essere 'allenato' sui messaggi nei vari cesti, l'allenamento si ha quando riclassifichi nel cesto appropriato un messaggio che POPFile ha classificato male. Devi anche settare il tuo client di posta elettronica in modo che filtri i messaggi secondo la classificazione fatta da POPFile. Trovi informazioni su come settare il tuo programma di posta elettronica all'indirizzo POPFile Documentation Project. Help_Bucket_Setup POPFile richiede che ci siano almeno due cesti oltre allo pseudo-cesto 'unclassified'. Quel che rende POPFile unico è che può classificare email distribuendole in un numero qualunque di cesti. Un setup semplice può prevedere i cesti "spam", "personale", and a "lavoro" bucket. Help_No_More Non mostrare più popfile-1.1.3+dfsg/languages/Hungarian.msg0000664000175000017500000003631211624177330017750 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode hu LanguageCharset ISO-8859-2 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage hu # Common words that are used on their own all over the interface Apply Alkalmaz On Be Off Ki TurnOn Bekapcsol TurnOff Kikapcsol Add Hozz畭d Remove Elvesz Previous Elz Next Kvetkez From Felad Subject T駑a Classification Oszt疝yoz疽 Reclassify レjraoszt疝yoz Undo Undo Close Bez疵 Find Keres Filter Szr Yes Igen No Nem ChangeToYes Kapcsold Igen-re ChangeToNo Kapcsold Nem-re Bucket Tart疝y Magnet M疊nes Delete Trl Create L騁rehoz To Cimzett Total ヨsszesit駸 Rename チtnevez Frequency Frekvencia Probability Valszins馮 Score Pontsz疥 Lookup Lookup # The header and footer that appear on every UI page Header_Title POPFile Vez駻lkzpont Header_Shutdown Shutdown POPFile Header_History History Header_Buckets Tart疝yok Header_Configuration Be疝lit疽ok Header_Advanced Halad Header_Security Biztons疊 Header_Magnets M疊nesek Footer_HomePage POPFile Honlap Footer_Manual K騷iknyv Footer_Forums Frumok Footer_FeedMe Adj enni! Footer_RequestFeature Tulajdons疊 k駻駸e Footer_MailingList Levlista Configuration_Error1 Az elv疝aszt karakter nem lehet hosszabb 1 karaktern駘 Configuration_Error2 A felhaszn疝i interf駸z port egy sz疥 kell hogy legyen 1 駸 65535 kztt. Configuration_Error3 A POP3 port egy sz疥 kell hogy legyen 1 駸 65535 kztt. Configuration_Error4 A lapsz疥 egy sz疥 kell hogy legyen 1 駸 1000 kztt. Configuration_Error5 A history-ban l騅 napok sz疥a egy sz疥 kell hogy legyen 1 駸 366 kztt. Configuration_Error6 A TCP idtll駱駸 egy sz疥 kell hogy legyen 10 駸 1800 kztt. Configuration_POP3Port POP3 figyel port Configuration_POP3Update Az j port: %s; A v疝toztat疽 駘etbel駱tet駸馼ez jra kell inditanod POPFile-t. Configuration_Separator Elv疝aszt karakter Configuration_SepUpdate Az j elv疝aszt karakter: %s Configuration_UI Felhaszn疝i interf駸z web port Configuration_UIUpdate Az j felhaszn疝i interf駸z web port %s; A v疝toztat疽 駘etbel駱tet駸馼ez jra kell inditanod POPFile-t. Configuration_History Egy lapon l騅 emailek sz疥a Configuration_HistoryUpdate Az egy lapon l騅 emailek sz疥a megv疝tozott: %s Configuration_Days A history-ban megrizend napok sz疥a Configuration_DaysUpdate A history-ban megrizend napok sz疥疣ak j 駻t駝e: %s Configuration_UserInterface Felhaszn疝i fellet Configuration_Skins Skinek Configuration_SkinsChoose V疝assz skin-t Configuration_Language Nyelv Configuration_LanguageChoose V疝assz nyelvet Configuration_ListenPorts Figyelj portokon Configuration_HistoryView History N騷et Configuration_TCPTimeout TCP Kapcsolat Timeout Configuration_TCPTimeoutSecs TCP kapcsolat timeout m疽odpercekben Configuration_TCPTimeoutUpdate A TCP kapcsolat timeout j 駻t駝e: %s Configuration_ClassificationInsertion Oszt疝yoz疽 beilleszt駸 Configuration_SubjectLine Beilleszt駸 az email t駑疔畸a Configuration_XTCInsertion X-Text-Classification alkalmaz疽a Configuration_XPLInsertion X-POPFile-Link beilleszt駸e Configuration_Logging Naplz疽 Configuration_None Nincs Configuration_ToScreen K駱ernyre Configuration_ToFile F疔lba Configuration_ToScreenFile K駱ernyre 駸 f疔lba Configuration_LoggerOutput Naplz kimenet Advanced_Error1 '%s' m疵 hozz lett adva a blokkol szavakhoz Advanced_Error2 A figyelmen kivl hagyott szavak csak betket, sz疥okat 駸 a kvetkez karaktereket tartalmayhatj疚:, ., _, -, @ Advanced_Error3 '%s' hozz畭dva a blokkolt szavak list疔疉oz Advanced_Error4 '%s' nincs a blokkolt szavak kztt Advanced_Error5 '%s' trlve a blokkolt szavak kzl Advanced_StopWords Figyelmen kivl hagyott szavak Advanced_Message1 A kvetkez szavak minden oszt疝yoz疽bl ki fognak maradni, mivel tl srn fordulnak el. Advanced_AddWord Sz hozz畭d疽a Advanced_RemoveWord Sz trl駸e History_Filter  (csak a %s kont駭er tartalma l疸hat) History_Search  (Tal疝atok %s t駑疵a) History_Title Utolj疵a be駻kezett zenetek History_Jump ワzenetre ugr疽 History_ShowAll Mutasd mindet History_ShouldBe Kellene lennie History_NoFrom nincs felad History_NoSubject nincs t駑a History_ClassifyAs Oszt疝yozd mint History_MagnetUsed Elt駻it m疊nes: History_ChangedTo レj 駻t駝: %s History_Already レjraoszt疝yozva mint %s History_RemoveAll Mindet trl History_RemovePage Trld ezt az oldalt History_Remove Klikkelj hogy trld a bejegyz駸eket a History-bl History_SearchMessage Keress felad/t駑a alapj疣 History_NoMessages Nincs zenet History_ShowMagnet M疊nesezett History_Magnet  (Csak m疊nesek 疝tal oszt疝yozott zenetek l疸szanak) History_ResetSearch Null痙疽 Password_Title Jelsz Password_Enter Ird be a jelszt Password_Go Mehet! Password_Error1 Rossz jelsz Security_Error1 A secure port egy sz疥 kell hogy legyen 1 駸 65535 kztt Security_Stealth Lopakod (Stealth) ワzemmd/Szerver Mkd駸 Security_NoStealthMode Nem (Stealth ワzemmd) Security_ExplainStats (Ha ez be van kapcsolva, akkor a POPFile naponta egyszer elkldi a kvetkez 3 v疝toz 駻t駝騁 egy script-nek a getpopfile.org-ra: bc (a kont駭erek sz疥a) mc (a POPFile 疝tal oszt疝yozott zenetek sz疥a) ec (az oszt疝yoz疽i hib疚 sz疥a). Ezeket az adatokat egy 疝lom疥yban tartom, 駸 arra haszn疝om ket hogy n馼疣y statisztikai adatok publik疝jak a POPFile hat駝onys疊疵l 駸 arrl hogy az emberek hogyan hasyn疝j疚 a programot. A Web szerverem kb. 5 napig rzi meg az inform當it, majd trli. Nem t疵olok semmif駘e kapcsolatot a begyjttt adatok 駸 az IP cimek kztt.) Security_ExplainUpdate (Ha ez be van kapcsolva, akkor a POPFile naponta egyszer elkldi a kvetkez 3 v疝toz 駻t駝騁 egy script-nek a getpopfile.org-ra: ma (az 疝talad haszn疝t POPFile f verzisz疥a) mi (az 疝talad haszn疝t POPFile al-verzisz疥a) bn (az 疝talad haszn疝t POPFile build sz疥a). Az 疝talad haszn疝t POPFile kapni fog egy grafik疸 a szervertl, ami a lap tetej駭 lesz l疸hat ha egy jabb verzi el駻het. Ezeket az adatokat egy 疝lom疥yban tartom, 駸 arra haszn疝om ket hogy n馼疣y statisztikai adatok publik疝jak a POPFile hat駝onys疊疵l 駸 arrl hogy az emberek hogyan hasyn疝j疚 a programot. A Web szerverem kb. 5 napig rzi meg az inform當it, majd trli. Nem t疵olok semmif駘e kapcsolatot a begyjttt adatok 駸 az IP cimek kztt.) Security_PasswordTitle Felhasz疝i fellet jelsz Security_Password Jelsz Security_PasswordUpdate Az j jelsz: %s Security_AUTHTitle Secure Password Authentication/AUTH Security_SecureServer Secure szerver Security_SecureServerUpdate Az j secure szerver: %s; Ez a v疝toz疽 nem fog 駻v駭ybe l駱ni amig ujra nem inditod a POPFile-t. Security_SecurePort Secure port Security_SecurePortUpdate Az j port: %s; Ez a v疝toz疽 nem fog 駻v駭ybe l駱ni amig ujra nem inditod a POPFile-t. Security_POP3 POP3 kapcsolat enged駘yez駸e t疱oli g駱ekkel Security_UI HTTP (Felhaszn疝i fellet) enged駘yez駸e t疱oli g駱ekkel Security_UpdateTitle Automatikus j verzi ellenrz駸 Security_Update Naponta ellenrizze hogy van-e j POPFile verzi Security_StatsTitle Statisztika kld駸e Security_Stats Kldd el a statisztik疚at Johnnak minden nap Magnet_Error1 A m疊nes '%s' m疵 l騁ezik a '%s' kont駭erben Magnet_Error2 Az j m疊nes '%s' sszeragadhat a '%s' m疊nessel 駸 hib疽 eredm駭yeket okozhat a '%s' kont駭erben. Az j m疊nes nem lett hozz畭dva a rendszerhez. Magnet_Error3 Hozd l騁re a '%s' m疊nest a '%s' kont駭erben. Magnet_CurrentMagnets M疊nesek Magnet_Message1 A kvetkez m疊nes minden egyes levelet a megadott kont駭erbe fog ir疣yitani. Magnet_CreateNew Hozz l騁re j m疊nest Magnet_Explanation H疵om fajta m疊nes l騁ezik:

  • Felad cime vagy neve: P駘d疼l: john@company.com, ha egy bizonyos email cimet keresnk
    company.com ha mindenkit meg akarunk tal疝ni aki a company.com cimrl jn,
    "John Doe" ha egy bizonyos embert akarunk kiszrni, John meg fog tal疝ni minden John-t
  • Cimyett cime vagy neve: Ugyanaz mint a Felad, de ez a Cimzett nev饕en 駸 cim饕en keres.
  • T駑a: P駘d疼l: hello meg fog tal疝ni minden email-t aminek a sz "hello" a t駑疔畸an szerepel
Magnet_MagnetType M疊nes tipus Magnet_Value ノrt駝 Magnet_Always Mindig a kont駭erbe megy Bucket_Error1 Kont駭er nevek csak kisbetket tartalmazhatnak a-tl z-ig, valamint a - 駸 _ jeleket Bucket_Error2 M疵 l騁ezik egy %s nev kont駭er Bucket_Error3 A %s nev kont駭er l騁rehozva Bucket_Error4 K駻em adjon meg egy nem-res szt Bucket_Error5 Kont駭er 疸nevezve %-rl %s-ra Bucket_Error6 A %s nev kont駭ert trltem Bucket_Title ヨsszefoglal Bucket_BucketName Kont駭er n騅 Bucket_WordCount Szavak sz疥a Bucket_WordCounts Szavak sz疥ai Bucket_UniqueWords Egyedi szavak Bucket_SubjectModification T駑a megv疝toztat疽 Bucket_ChangeColor Szin megv疝toztat疽a Bucket_NotEnoughData Nincs el馮 adat Bucket_ClassificationAccuracy Az oszt疝yoz疽 pontoss疊a Bucket_EmailsClassified Oszt疝yozott Emailek sz疥a Bucket_EmailsClassifiedUpper Oszt疝yozott Emailek sz疥a Bucket_ClassificationErrors Oszt疝yoz疽i hib疚 Bucket_Accuracy Pontoss疊 Bucket_ClassificationCount Oszt疝yoz疽ok sz疥a Bucket_ResetStatistics Statisztika null痙疽a Bucket_LastReset Utols null痙疽 Bucket_CurrentColor %s a jelenlgi szin %s Bucket_SetColorTo %s szin %s-ra 疝lit疽a Bucket_Maintenance Karbantart疽 Bucket_CreateBucket Kont駭er l騁rehoz疽a: Bucket_DeleteBucket Kont駭er trl駸e: Bucket_RenameBucket Kont駭er 疸nevez駸e: Bucket_Lookup Keres駸 Bucket_LookupMessage Sz keres駸e a kont駭erekben Bucket_LookupMessage2 Keres駸 eredm駭ye: Bucket_LookupMostLikely %s legvalszinbben a kvetkez helyen fog megjelenni: %s Bucket_DoesNotAppear

%s egyik kont駭erben sem tal疝hat Bucket_DisabledGlobally Glob疝isan letiltott Bucket_To to Bucket_Quarantine Karant駭 SingleBucket_Title %s r駸zletei SingleBucket_WordCount Kont駭erben l騅 szavak sz疥a SingleBucket_TotalWordCount ヨsszes sz sz疥a SingleBucket_Percentage Teljes sz痙al駝 SingleBucket_WordTable Szt畸l痙at % -nak SingleBucket_Message1 A csillaggal jellt szavak(*) r駸zt vettek az oszt疝yz疽ban a POPFile legutbbi indit疽a ta. Kattints egy szra hogy megn騷d a kont駭erenk駭ti valszins馮騁. SingleBucket_Unique %s egyedi Session_Title POPFile Session Lej疵t Session_Error Ez a POPFile session lej疵t. Egy lehets馮es ok hogy elinditotta 駸 le疝litotta a POPFile-t, de a bng駸zt nyitva hagyta. K駻em kattintson a fell l騅 linkek egyik駻e. popfile-1.1.3+dfsg/languages/Hellenic.msg0000664000175000017500000005420611624177330017561 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode gr LanguageCharset ISO-8859-7 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply ナ碵聳 On ナ褥腋 Off チ褊褥腋 TurnOn ナ褥胥゚銛 TurnOff チ褊褥胥゚ Add ミ鞐 Remove チ硴鴕゙ Previous ミ鈬褊 Next ナ褊 From チン碪 Subject ネン Cc ハ鳫. Classification ヤ碚鳫銛 Reclassify ナ硼磑碚鳫銛 Probability ミ鳧硼鉚 Scores ツ礪聲褪 QuickMagnets デ胥 フ矼゙褪 Undo Undo Close ハ裃鴈 Find ナ褫 Filter ヨ゚ Yes ヘ矚 No マ ChangeToYes チ矼゙ ヘ矚 ChangeToNo チ矼゙ シ Bucket チ裃 Magnet フ矼゙銓 Delete ト鱆胝磋゙ Create ト銕鴆聲 To ミ Total モ Rename フ襁碯゚ Frequency モ鉚 Probability ミ鳧硼鉚 Score ツ礪 Lookup ナ襄 Word ヒン Count ナ硼゚裨 Update ナ銕ン Refresh ヨ褫ワ鴣 # The header and footer that appear on every UI page Header_Title ハ褊 ナン胱 POPFile Header_Shutdown ハ裃鴈 POPFile Header_History ノ鳰 Header_Buckets チ裃 Header_Configuration ナ鴉聨 Header_Advanced ミ銕ン褪 ナ鴉聨 Header_Security チワ裨 Header_Magnets フ矼゙褪 Footer_HomePage ノ褄゚蓊 POPFile Footer_Manual ナ胱裨゚蓚 Footer_Forums モ踞゙裨 Footer_FeedMe モ裨ワ Footer_RequestFeature ニ鉚゙ ツ褄裨 Footer_MailingList ナ銕褥鳰ワ mail Configuration_Error1 マ 蓚磔鴣鳰 碵碎゙碪 ン裨 裃硅 ン碪. Configuration_Error2 ヤ user interface port ン裨 裃硅 襁碚 1 硅 65535 Configuration_Error3 ヤ POP3 listen port ン裨 裃硅 襁碚 1 硅 65535 Configuration_Error4 ヤ ン肄韵 褄゚蓊 ン裨 裃硅 襁碚 1 硅 1000 Configuration_Error5 マ 碵鳧 銕褥 肓 ゙銛 鴣鳰 ン裨 裃硅 襁碚 1 硅 366 Configuration_Error6 ヌ 碵ワ襁 TCP timeout ン裨 裃硅 襁碚 10 硅 1800 Configuration_Error7 ヌ 碵ワ襁 XML RPC listen port ン裨 裃硅 襁碚 1 硅 65535 Configuration_POP3Port POP3 listen port Configuration_POP3Update ヌ 碵ワ襁 POP3 port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Configuration_XMLRPCUpdate ヌ 碵ワ襁 XML-RPC port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Configuration_XMLRPCPort XML-RPC listen port Configuration_SMTPPort SMTP listen port Configuration_SMTPUpdate ヌ 碵ワ襁 SMTP port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Configuration_NNTPPort NNTP listen port Configuration_NNTPUpdate ヌ 碵ワ襁 NNTP port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Configuration_POP3Separator POP3 host:port:碵碎゙碪 蓚磔鴣 Configuration_NNTPSeparator NNTP host:port:ラ碵碎゙碪 蓚磔鴣 Configuration_POP3SepUpdate チ矼゙ 碵碎゙ 蓚磔鴣 POP3 %s Configuration_NNTPSepUpdate チ矼゙ 碵碎゙ 蓚磔鴣 NNTP %s Configuration_UI Web port 褞鴕ワ裨碪 褄ン胱 Configuration_UIUpdate Updated user interface web port to %s; this change will not take affect until you restart POPFile Configuration_History チ鳧 銕ワ 硼ワ モ褄゚蓊 Configuration_HistoryUpdate チ矼゙ 碵鳧 銕ワ 硼ワ 褄゚蓊 %s Configuration_Days チ韜 銕褥 磑硅 鴣鳰 Configuration_DaysUpdate チ矼゙ 碵韜 銕褥 磑硅 鴣鳰 %s Configuration_UserInterface ナ鴕ワ裨 ナン胱 Configuration_Skins ナワ鴣 Configuration_SkinsChoose ナ鴉聳 褌ワ鴣銓 Configuration_Language テ Configuration_LanguageChoose ナ鴉聳 テ碪 Configuration_ListenPorts ナ鴉聨 褞鳰鳫゚碪 Configuration_HistoryView ノ鳰 Configuration_TCPTimeout Connection Timeout Configuration_TCPTimeoutSecs Connection timeout 蒟褥褞 Configuration_TCPTimeoutUpdate チ矼゙ connection timeout %s Configuration_ClassificationInsertion ナ鴣矼聳 ハ裨ン ゙磑 Configuration_SubjectLine チ矼゙ ネン磑 フ銕ワ Configuration_XTCInsertion X-Text-Classification Header Configuration_XPLInsertion X-POPFile-Link Header Configuration_Logging ヌ褥肓 ナ褥肄 Configuration_None ハ硼ン Configuration_ToScreen モ鈿 マ顰 Configuration_ToFile モ チ裃 Configuration_ToScreenFile モ鈿 マ顰 硅 碵裃 Configuration_LoggerOutput ナワ鴣 ヌ褥聲 ナ褥肄 Configuration_GeneralSkins ナ硼゚裨 Configuration_SmallSkins フ鳰ン ナ硼゚裨 Configuration_TinySkins ミ鴆 フ鳰ン ナ硼゚裨 Configuration_CurrentLogFile <current log file> Advanced_Error1 '%s' 裃硅 ゙蓍 鶯 褓硅褊褪 ン裨 Advanced_Error2 マ 褓硅褊褪 ン裨 褥鴉碆籤 硴硼褥鳰ン ン裨 , ., _, -, @ 碵碎゙褪 Advanced_Error3 '%s' ン韈 鶯 褓硅褊褪 ン裨 Advanced_Error4 '%s' 蒟 硼゙裨 鶯 褓硅褊褪 ン裨 Advanced_Error5 '%s' 磋硅ン韈 碣 鶯 褓硅褊褪 ン裨 Advanced_StopWords ヒン裨 褓硅硅 Advanced_Message1 ヤ POPFile 褓硅裃 鶯 碎韃 ワ 褌硼鱶褊褪 ン裨 : Advanced_AddWord ミ鞐 ヒン銓 Advanced_RemoveWord チ矚褫 ヒン銓 History_Filter  (褌硼゚趺硅 碵裃 %s) History_FilterBy ヨ鴉ワ鴣 ゙ History_Search  (硼礦゙銛 肓 チン/ネン %s) History_Title ミ磑 ブ磑 History_Jump ブ磑 碣 History_ShowAll ナワ鴣 History_ShouldBe ヘ 碚鴈鉅裃 History_NoFrom ト褊 ン裨 碣ン History_NoSubject ト褊 ワ裨 鞏 History_ClassifyAs ヘ 碚鳫鉅裃 硼 History_MagnetUsed フ矼゙銓 ゙ History_MagnetBecause フ矼゙銓 ゙

ナ裨 碚鳫鉅裃 %s 脩 矼゙ %s

History_ChangedTo チ碚 %s History_Already ナ裨 ゙蓍 褞硼磑碚鳫鉅裃 %s History_RemoveAll ト鱆胝磋゙ マ History_RemovePage ト鱆胝磋゙ モ褄゚蓊 History_Remove テ鱆 蓚矼ワ襁 鴒裃 鴣鳰 磑゙ History_SearchMessage チ碚゙銛 チン/ネン History_NoMessages ト褊 ワ フ鈿磑 History_ShowMagnet 矼鉚鴣ン History_ShowNoMagnet 矼鉚鴣ン History_Magnet  (褌ワ鴣 矼鉚鴣ン 銕ワ) History_NoMagnet  (褌ワ鴣 ゙ 矼鉚鴣ン 銕ワ) History_ResetSearch ナ硼磋ワ Password_Title モ韈 Password_Enter テワ 韈 Password_Go ミ゙! Password_Error1 ヒワ韵 韈 Security_Error1 ヤ port ン裨 裃硅 ン碪 碵鳧 襁碚 1 硅 65535 Security_Stealth ヒ裨聲 ヂ/ヒ裨聲 Server Security_NoStealthMode マ ( ヒ裨聲 チ銓 ) Security_ExplainStats (フ 磆゙ 鈿 褞鴉聳 褊褥聳 POPFile ン裨 ワ韃 銕ン 鶯 碎韃 裃 碵碆ン ン 胝碆 getpopfile.org: bc ( 碵裃 銛鴈鴆硅 ), mc ( 碚鳫銕ン 銕ワ) and ec ( 礪 碚鳫銛銓). チワ 碵裨韃硅 硅 銛鴈鴆硅 肓 磔韵 磑鴣鳰ン 肓 ゙褪 銛鴈鴆 POPFile 硴ワ 硅 碣褄褫磑鳰ワ 磆 蔡裨s. ヤ 碵裃 籥硅 鈿 碵ン襄 褊韈ン; ト褊 聲硅 襁鴣゚ 襁碚 磑鴣鳰 硅 褌ン 蓚襄襌 IP.) Security_ExplainUpdate (フ 磆゙ 鈿 褞鴉聳 褊褥聳 POPFile ン裨 ワ韃 銕ン 鶯 碎韃 裃 碵碆ン ン 胝碆 getpopfile.org:: ma ( 鴆 碵鳧 ン蔡銓 褊 ゙ POPFile), mi ( 蒟褥 碵鳧 ン蔡銓 褊 ゙ POPFile) 硅 bn ( 碵鳧 ン蔡銓 褊 ゙ POPFile). ヤ POPFile 碆籤裨 ゚ 碣ワ銛 鈿 ゙ 胝磋鳰 褌硼゚趺硅 鈿 ワ 褥鰤 銓 褄゚蓊, 硅 碪 裨蔡鱧゚ ワ裨 ン 褊銕褥ン ン蔡. ヤ 碵裃 籥硅 鈿 碵ン襄 褊韈ン; ト褊 聲硅 襁鴣゚ 襁碚 磑鴣鳰 硅 褌ン 蓚襄襌 IP.) Security_PasswordTitle モ韈 ナ鴕ワ裨碪 ラ゙銓 Security_Password モ韈 Security_PasswordUpdate ヤ 韈 ワ碚 %s Security_AUTHTitle Remote Servers Security_SecureServer POP3 SPA/AUTH server Security_SecureServerUpdate ヌ 碵ワ襁 POP3 SPA/AUTH secure server ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Security_SecurePort POP3 SPA/AUTH port Security_SecurePortUpdate ヌ 碵ワ襁 POP3 SPA/AUTH port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Security_SMTPServer SMTP chain server Security_SMTPServerUpdate ヌ 碵ワ襁 SMTP chain server ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Security_SMTPPort SMTP chain port Security_SMTPPortUpdate ヌ 碵ワ襁 SMTP chain port ワ碚 %s; マ 硴矼ン 鞦 聲 褊褥聨 鈿 褞褊 裲゚銛 POPFile Security_POP3 ヘ 聲硅 碣蒟ン 萬裨 POP3 碣 ヌ/ユ 葹 (裨ワ趺硅 褞硼裲゚銛 POPFile ) Security_SMTP ヘ 聲硅 碣蒟ン 萬裨 SMTP 碣 ヌ/ユ 葹 (裨ワ趺硅 褞硼裲゚銛 POPFile ) Security_NNTP ヘ 聲硅 碣蒟ン 萬裨 NNTP 碣 ヌ/ユ 葹 (裨ワ趺硅 褞硼裲゚銛 POPFile ) Security_UI ヘ 聲硅 碣蒟ン 萬裨 HTTP 碣 ヌ/ユ 葹 (裨ワ趺硅 褞硼裲゚銛 POPFile ) Security_XMLRPC ヘ 聲硅 碣蒟ン 萬裨 XML-RPC 碣 ヌ/ユ 葹 (裨ワ趺硅 褞硼裲゚銛 POPFile ) Security_UpdateTitle チ磑 ナ裙 肓 ナ銕褥ン褪 ナ蕈裨 Security_Update ハ礪銕褥鳫 ン裙 肓 ナ銕褥ン褪 ナ蕈裨 POPFile Security_StatsTitle ヂ モ磑鴣鳰 Security_Stats ハ礪銕褥鳫゙ ヂ モ磑鴣鳰 Magnet_Error1 マ フ矼゙銓 '%s' ワ裨 ゙蓍 碵裃 '%s' Magnet_Error2 マ ン フ矼゙銓 '%s' 裃硅 硼゚碯 ゙蓍 ワ '%s' 碵裃 '%s' 硅 磆 鞦 蓍胥 硼鞦ン褪 碚鳫゙裨. マ ン 矼゙銓 蒟 襁ン韃.. Magnet_Error3 ト銕鴆聲 ン 矼゙ '%s' 碵裃 '%s' Magnet_CurrentMagnets ユワ褪 フ矼゙褪 Magnet_Message1 マ 碎韵 矼゙褪 ワ 碚鳫 ゙磑 碪 礪鴣ン 碵裃 :. Magnet_CreateNew ト銕鴆聲 ン 矼゙ Magnet_Explanation チ゚ 矼゙ 裃硅 蓚礪ン鴈:
  • チ ト鵄頷 マ: ミ..: john@company.com 肓 肚裲鴈ン 蓚襄頷輳,
    company.com 肓 褪 鶯 蓚襄裨 磑硴゙胥 company.com,
    John Doe 肓 肚裲鴈ン , John 肓 John
  • ミ/ハ鳫. 蓚頷 : ィマ 肓 チン 硴 磋ワ 裝゚ ミ/ ハ鳫.:
  • ネン : ミ..: hello 肓 矼鉚鴣韵 ゙磑 褥鰡 鈿 ン hello 鞏
Magnet_MagnetType ヤ フ矼鉚 Magnet_Value チ゚ Magnet_Always ミ硼 碚鳫裃硅 碵裃 Magnet_Jump フ矼゙褪 碣 Bucket_Error1 ヤ 磑 碵裃 褥鰡 褂ワ 矼肭鳰ワ 胝ワ磑 a ン z, 碵鳧 0 襌 9, 硅 碵碎゙褪 - 硅 _ Bucket_Error2 チ裃 %s ワ裨 ゙蓍 Bucket_Error3 ト銕鴆聳韈 碵裃 %s Bucket_Error4 ミ碵碎硴 裨ワ肄 褊゙ ン Bucket_Error5 ヤ 碵裃 %s 襁ワ鉤 %s Bucket_Error6 ト鱆胝ワ韈 碵裃 %s Bucket_Title ミ褥゚鋩 Bucket_BucketName チ裃 Bucket_WordCount ミ゙韵 ヒン襌 Bucket_WordCounts モ磑鴣鳰ワ ヒン襌 Bucket_UniqueWords フ砌鳰ン ヒン裨 Bucket_SubjectModification チ矼゙ ネン磑 フ銕ワ Bucket_ChangeColor チ矼゙ ラ磑 Bucket_NotEnoughData チ褞碵゙ ト裝ン Bucket_ClassificationAccuracy チ゚粢鱆 ヤ碚鳫銛銓 Bucket_EmailsClassified ヤ碚鳫銕ン ゙磑 Bucket_EmailsClassifiedUpper ヤ碚鳫銕ン ブ磑 Bucket_ClassificationErrors モワ磑 ヤ碚鳫銛銓 Bucket_Accuracy チ゚粢鱆 ヤ碚鳫銛銓 Bucket_ClassificationCount チ鳧. ヤ碚鳫゙襌 Bucket_ClassificationFP リ襄葯 ネ襁鳰ワ Bucket_ClassificationFN リ襄葯 チ鉚鳰ワ Bucket_ResetStatistics フ鈕褊鴣 モ磑鴣鳰 Bucket_LastReset ヤ褄襄矚 フ鈕褊鴣 Bucket_CurrentColor ン %s 裃硅 %s Bucket_SetColorTo マ鴣 磑 %s %s Bucket_Maintenance モ゙銛 チ裃 Bucket_CreateBucket ト銕鴆聲 碵裃 Bucket_DeleteBucket ト鱆胝磋゙ 碵裃 Bucket_RenameBucket フ襁碯゚ 碵裃 Bucket_Lookup ナ褫 Bucket_LookupMessage ナ襄 ン襌 碵裃 Bucket_LookupMessage2 チ褄ン磑 褫銓 ン襌 Bucket_LookupMostLikely %s 裃硅 鴆 鳧硼 硼゙裨 %s Bucket_DoesNotAppear

%s 蒟 硼゙裨 硼ン 碣 碵裃 Bucket_DisabledGlobally テ褊鳰 チ褊褥胥鱸ン Bucket_To Bucket_Quarantine ハ碵硼゚ SingleBucket_Title ヒ褞ン裨褪 碵裃 %s SingleBucket_WordCount チ鳧 ン襌 碵裃 SingleBucket_TotalWordCount モ鳰ン 褌硼゚裨 ン襌 SingleBucket_Percentage ミ 褞゚ SingleBucket_WordTable ミ゚碎碪 ン襌 肓 %s SingleBucket_Message1 ハワ ゚ ワ ン 胝ワ 肓 蒟゚ 鶯 ン裨 碵゚跣 碣 磆. ハワ ゚ ゚ ン 肓 蒟゚ 鶯 鳧硼鉚褪 硼゙裨 鴆葯 碵裃.. SingleBucket_Unique %s 砌鳰ン SingleBucket_ClearBucket ト鱆胝磋゙ ン襌 Session_Title ヌ 裝゚ POPFile ン裨 ゙裨 Session_Error ヌ 碵 裝゚ POPFile ン裨 ゙裨. チ 裃 裃硅 碣ン褫 銓 褞硼裲゚銛銓 POPFile 褊 胝碆 褌ワ鴣銓 鴣褄゚蕀 碪 碵ン裨 硼鳰. ミ碵碎硴 ワ ゚ ワ鱆 碣 鶯 ワ韜 萬裨 肓 碣磑碯゙襁 鈿 褞鳰鳫゚ POPFile. View_Title ナワ鴣 フ褌ン ブ磑 Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of a message message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the message's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many messages have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the message classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of messages classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify message according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the message before it is passed on to the message client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying message due to their relative frequency in message in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Hebrew.msg0000664000175000017500000006135311624177330017253 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode he LanguageCharset UTF-8 LanguageDirection rtl # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply ラゥラ槞勉ィ On ラ、ラ「ラ燮 Off ラ嶼泰勉 TurnOn ラ蕃、ラ「ラ TurnOff ラ嶼泰 Add ラ蕃勉。ラ」 Remove ラ蕃。ラィ Previous ラァラ勉沌 Next ラ蕃泰 From ララェラァラ泰 ラ Subject ララ勉ゥラ Classification ラ。ラ燮勉勉 Reclassify ラ。ラ燮勉勉 ラ槞隣沌ゥ Undo ラ隣儲ィラ ラ慵ァラ勉沌 Close ラ。ラ潰勉ィ Find ラ槞ヲラ Filter ラ。ラ燮ラ勉 Yes ラ嶼 No ラ慵 ChangeToYes ラゥララ ラ 'ラ嶼' ChangeToNo ラゥララ ラ 'ラ慵' Bucket ラ槞ヲラ泰勉ィ Magnet ラ槞潰ラ Delete ラ槞隣ァ Create ラ蕃勉。ラ」 To ララゥラ慵 ラ Total ラ。ラ ラ嶼勉慵 Rename ラゥラ燮ラ勉 ラゥラ Frequency ラェラ沌燮ィラ勉ェ Probability ラ蕃。ラェラ泰ィラ勉ェ Score ラヲラ燮勉 Lookup ラ隣、ラゥ Cc CC Count ラ槞。ラ、ラィ QuickMagnets ラ槞潰ラ俎燮 ラ槞蕃燮ィラ燮 Refresh ラィラ「ララ勉 ラ蕃ェラヲラ勉潰 Scores ラヲラ燮勉ラ燮 Update ラ「ラ燮沌嶼勉 View_Title ラ、ラィラ俎 ラ蕃勉沌「ラ ラ。ラ、ラヲラ燮、ラ燮ェ Windows_TrayIcon ラ蕃ヲラ ラ碩燮ァラ勉 ラゥラ POPfile ラ泰槞潰ゥ ラ隣慵勉ラ勉ェ Word ラ槞燮慵 # The header and footer that appear on every UI page Header_Title ラ慵勉 ラ蕃泰ァラィラ ラゥラ POPFile Header_Shutdown ラ嶼燮泰勉 ラェラ勉嶼ラェ POPFile Header_History ラ蕃燮。ラ俎勉ィラ燮 Header_Buckets ラ槞ヲラ泰勉ィラ燮 Header_Configuration ラ蕃潰沌ィラ勉ェ Header_Advanced ラ蕃潰沌ィラ勉ェ ラ槞ェラァラ沌槞勉ェ Header_Security ラ碩泰俎隣 Header_Magnets ラ槞潰ラ俎燮 Footer_HomePage ラ沌」 ラ蕃泰燮ェ ラゥラ POPFile Footer_Manual ラ蕃勉ィラ碩勉ェ ラ蕃、ラ「ラ慵 Footer_Forums ラ、ラ勉ィラ勉槞燮 Footer_FeedMe ラェラィラ勉槞 Footer_RequestFeature ラ泰ァラゥ ラ隣燮沌勉ゥ\ラゥラ燮ラ勉 Footer_MailingList ラィラゥラ燮槞ェ Email Configuration_Error1 ラ蕃ェラ ラ蕃槞、ラィラ燮 ラ泰燮 ラ槞燮慵燮 ラヲラィラ燮 ラ慵蕃燮勉ェ ラェラ ラ燮隣燮 Configuration_Error2 ラ蕃潰沌ィラェ ラ蕃ゥラ「ラィ ラゥラ ラ槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ ラヲラィラ燮嶼 ラ慵蕃燮勉ェ ラ槞。ラ、ラィ ラ泰燮 1 ラ 65535 Configuration_Error3 ラ蕃潰沌ィラェ ラ蕃ゥラ「ラィ ラゥラ 'POP3' ラヲラィラ燮嶼 ラ慵蕃燮勉ェ ラ槞。ラ、ラィ ラ泰燮 1 ラ 65535 Configuration_Error4 ラ潰勉沌 ラ蕃「ラ槞勉 ラヲラィラ燮 ラ慵蕃燮勉ェ ラ槞。ラ、ラィ ラ泰燮 1 ラ 1000 Configuration_Error5 ラ槞。ラ、ラィ ラ蕃燮槞燮 ラゥラ蕃ェラ勉嶼ラ ラェラゥラ槞勉ィ ラ蕃燮。ラ俎勉ィラ燮 ラヲラィラ燮 ラ慵蕃燮勉ェ ラ泰燮 1 ラ 366 Configuration_Error6 ラ槞潰泰慵ェ ラ蕃儲槞 ラ慵蕃ェラ隣泰ィラ勉ェ TCP ラヲラィラ燮嶼 ラ慵蕃燮勉ェ ラ泰燮 10 ラ 1800 ラ槞燮慵燮ゥララ燮勉ェ Configuration_POP3Port POP3 ラゥラ「ラィ ラ蕃蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 Configuration_POP3Update ラ蕃潰沌ィラェ ラ蕃ゥラ「ラィ ラゥラ勉ラェラ ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ碩隣ィラ ラ碩燮ェラ隣勉 POPFile ラ槞隣沌ゥ Configuration_UI ラゥラ「ラィ ラ蕃隣燮泰勉ィ ラゥラ ラ槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ Configuration_UIUpdate ラ蕃潰沌ィラェ ラ蕃ゥラ「ラィ ラゥラ ラ槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ ラゥラ勉ラェラ ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ碩隣ィラ ラ碩燮ェラ隣勉 POPFile ラ槞隣沌ゥ Configuration_History ラ槞。ラ、ラィ ラ蕃勉沌「ラ勉ェ ラゥラ燮ィラ碩 ラ泰「ラ槞勉 ラ碩隣 Configuration_HistoryUpdate ラ槞。ラ、ラィ ラ蕃勉沌「ラ勉ェ ラゥラ燮ィラ碩 ラ泰「ラ槞勉 ラ碩隣 ラ「ラ勉沌嶼 ラ %s Configuration_Days ラ槞。ラ、ラィ ラ蕃燮槞燮 ラゥラ蕃ェラ勉嶼ラ ラェラゥラ槞勉ィ ラ蕃燮。ラ俎勉ィラ燮 Configuration_DaysUpdate ラ槞。ラ、ラィ ラ蕃燮槞燮 ラゥラ蕃ェラ勉嶼ラ ラェラゥラ槞勉ィ ラ蕃燮。ラ俎勉ィラ燮 ラ「ラ勉沌嶼 ラ %s Configuration_UserInterface ラ槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ Configuration_Skins ラ槞ィラ碩 Configuration_SkinsChoose ラ泰隣ィ ラ槞ィラ碩 Configuration_Language ラゥラ、ラ Configuration_LanguageChoose ラ泰隣ィ ラゥラ、ラ Configuration_ListenPorts ラゥラ「ラィラ ラ蕃蕃碩儲ラ Configuration_HistoryView ラ蕃燮。ラ俎勉ィラ燮 Configuration_TCPTimeout ラ槞潰泰慵ェ ラ儲槞 ラ蕃ェラ隣泰ィラ勉ェ TCP Configuration_TCPTimeoutSecs ラ槞潰泰慵ェ ラ儲槞 ラ蕃ェラ隣泰ィラ勉ェ TCP ラ泰ゥララ燮勉ェ Configuration_TCPTimeoutUpdate ラ槞潰泰慵ェ ラ儲槞 ラ蕃ェラ隣泰ィラ勉ェ TCP ラゥラ勉ラェラ ラ %s Configuration_ClassificationInsertion ラ蕃勉。ラ、ラェ ラ俎ァラ。ラ ラ慵蕃勉沌「ラ勉ェ Configuration_SubjectLine ラゥラ燮ラ勉 ラゥラ勉ィラェ ラゥララ勉ゥラ ラゥラ ラ蕃勉沌「ラ勉ェ Configuration_XTCInsertion ラ蕃勉。ラ、ラェ X-Text-Classification ラ慵ィラ碩ゥ ラ蕃勉沌「ラ Configuration_XPLInsertion ラ蕃勉。ラ、ラェ X-POPFile-Link Header ラ慵潰勉」 ラ蕃蕃勉沌「ラ Configuration_Logging ラィラゥラ勉槞ェ ラ燮勉槞 Configuration_None ラ嶼慵勉 Configuration_ToScreen ラ慵槞。ラ Configuration_ToFile ラ慵ァラ勉泰・ Configuration_ToScreenFile ラ慵槞。ラ ラ勉慵ァラ勉泰・ Configuration_LoggerOutput ラ、ラ慵 Configuration_GeneralSkins ラ槞ィラ碩勉ェ Configuration_SmallSkins ラ槞ィラ碩勉ェ ラァラ俎ラ燮 Configuration_TinySkins ラ槞ィラ碩勉ェ ラァラ俎ラ俎ラ燮 Configuration_CurrentLogFile <ラァラ勉泰・ ラ蕃燮勉槞 ラ蕃「ラ嶼ゥラ勉> Configuration_Error7 ラ槞。ラ、ラィ ラ蕃ゥラ「ラィ ラゥラ XML RPC ラ蕃槞勉潰 ラヲラィラ燮 ラ慵蕃燮勉ェ ラ槞。ラ、ラィ ラ泰燮 1 ラ 65535 Configuration_NNTPPort ラゥラ「ラィ ラ蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 NNTP Configuration_NNTPSeparator ラェラ ラ蕃、ラィラ沌ェ ラ「ラィラ嶼 NNTP host:port:user Configuration_NNTPSepUpdate ラェラ ラ蕃蕃、ラィラ沌 ラ慵「ラィラ嶼 NNTP ラ「ラ勉沌嶼 ラ %s Configuration_NNTPUpdate ラゥラ「ラィ NNTP ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ. Configuration_POP3Separator ラェラ ラ蕃、ラィラ沌ェ ラ「ラィラ嶼 POP3 host:port:user Configuration_POP3SepUpdate ラェラ ラ蕃蕃、ラィラ沌 ラゥラ ラ「ラィラ嶼 POP3 ラ「ラ勉沌嶼 ラ %s Configuration_SMTPPort ラゥラ「ラィ ラ蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 SMTP Configuration_SMTPUpdate ラゥラ「ラィ ラ蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 SMTP ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ. Configuration_XMLRPCPort ラゥラ「ラィ ラ蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 XML-RPC Configuration_XMLRPCUpdate ラゥラ「ラィ ラ蕃碩儲ラ ラ慵、ラィラ勉俎勉ァラ勉 XML-RPC ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ. Advanced_Error1 '%s' ラ嶼泰ィ ララ槞ヲラ碩ェ ラ泰ィラゥラ燮槞ェ ラ蕃槞燮慵燮 ラ慵蕃ェラ「ラ慵槞勉ェ Advanced_Error2 ラ槞燮慵燮 ラ泰ィラゥラ燮槞ェ ラ蕃蕃ェラ「ラ慵槞勉ェ ラ隣燮泰勉ェ ラ慵蕃嶼燮 ラ碩勉ェラ燮勉ェ, ラ槞。ラ、ラィラ燮 ラ勉蕃ェラ勉燮 ., _, - ラ碩 @ ラ泰慵泰 Advanced_Error3 '%s' ララゥラ槞ィラ ラ泰ィラゥラ燮槞ェ ラ蕃槞燮慵燮 ラ慵蕃ェラ「ラ慵槞勉ェ Advanced_Error4 '%s' ラ碩燮ラ ラ泰ィラゥラ燮槞ェ ラ蕃槞燮慵燮 ラ慵蕃ェラ「ラ慵槞勉ェ Advanced_Error5 '%s' ラ蕃勉。ラィラ ラ槞ィラゥラ燮槞ェ ラ蕃槞燮慵燮 ラ慵蕃ェラ「ラ慵槞勉ェ Advanced_StopWords ラ槞燮慵燮 ラゥラ槞蕃 ラ蕃ェラ勉嶼ラ ラ槞ェラ「ラ慵槞ェ Advanced_Message1 ラ蕃ェラ勉嶼ラ ラ蕃ェラ「ラ慵槞 ラ槞槞慵燮 ララ、ラ勉ヲラ勉ェ ラ碩慵: Advanced_AddWord ラ蕃勉。ラ」 ラ槞燮慵 Advanced_RemoveWord ラ蕃。ラィ ラ槞燮慵 Advanced_AllParameters ラ嶼 ラ蕃、ラィラ槞俎ィラ燮 ラゥラ POPFile Advanced_Parameter ラ、ラィラ槞俎ィ Advanced_Value ラ「ラィラ Advanced_Warning ラィラゥラ燮槞 ラ儲 ラ槞、ラィラ俎ェ ラ碩ェ ラ嶼 ラ蕃、ラィラ槞俎ィラ燮 ラゥラ ラ蕃ェラ勉嶼ラ. ラ慵槞ゥラェラ槞ゥラ燮 ラ槞ェラァラ沌槞燮 ラ泰慵泰: ララ燮ェラ ラ慵ゥララ勉ェ ラ嶼 ラ「ラィラ ラ勉慵慵隣勉・ ラ「ラ ラ嶼、ラェラ勉ィ 'ラ「ラ沌嶼勉' History_Filter  )ラェラヲラ勉潰ェ ラ槞ヲラ泰勉ィ %s ラ泰慵泰( History_FilterBy ラ。ラ燮ラ勉 ラ慵、ラ History_Search  ) ラ隣燮、ラ勉ゥ '%s' ラ泰勉ヲラ「 ラ 'ララゥラ慵 ラ' ラ勉ラ勉ゥラ ラ蕃蕃勉沌「ラ( History_Title ラ蕃勉沌「ラ勉ェ ラ碩隣ィラ勉ラ勉ェ History_Jump ラ潰燮ゥラ ラ燮ゥラ燮ィラ ラ慵蕃勉沌「ラ History_ShowAll ラ蕃ィラ碩 ラ碩ェ ラ蕃嶼 History_ShouldBe ラヲラィラ燮 ラ慵蕃燮勉ェ History_NoFrom ラゥラ勉ィラェ 'ララゥラ慵 ラ' ラ隣。ラィラ History_NoSubject ラゥラ勉ィラェ ラ蕃ラ勉ゥラ ラ隣。ラィラ馬o subject line History_ClassifyAs ラ。ラ勉勉 ラ History_MagnetUsed ラ槞潰ラ ラゥラ勉槞ゥ History_ChangedTo ラゥララ ラ %s History_Already ラ嶼泰ィ ラ。ラ勉勉 ラ %s History_RemoveAll ラ蕃。ラィ ラ碩ェ ラ嶼 ラ碩慵 ラゥララ泰隣ィラ History_RemovePage ラ蕃。ラィ ラ碩ェ ラ嶼 ラ碩慵 ラゥラ泰「ラ槞勉 History_Remove ラ慵蕃。ラィラェ ラ、ラィラ燮俎燮 ラ槞蕃蕃燮。ラ俎勉ィラ燮 History_SearchMessage ラ隣燮、ラ勉ゥ ラ 'ララゥラ慵 ラ' ラ勉ゥラ勉ィラェ ラ蕃ラ勉ゥラ History_NoMessages ラ慵 ララ槞ヲラ碩 ラ蕃勉沌「ラ勉ェ History_ShowMagnet ラ蕃勉沌「ラ勉ェ ラ槞槞勉潰ラ俎勉ェ History_Magnet  (ラ、ラィラ燮俎燮 ラゥラ。ラ勉勉潰 ラ「"ラ ラ槞潰ラ ラ泰慵泰) History_ResetSearch ラ碩燮、ラ勉。 ラ隣燮、ラ勉ゥ History_MagnetBecause ラ「"ラ ラ槞潰ラ

ラ。ラ燮勉勉 ラ %s History_NoMagnet  )ラィラァ ラ蕃勉沌「ラ勉ェ ラゥラ。ラ勉勉潰 ラ慵慵 ラ槞潰ラ ラ槞勉ヲラ潰勉ェ) History_ShowNoMagnet ラ泰慵ェラ ラ槞槞勉潰ラ俎燮 Password_Title ラ。ラ燮。ラ槞 Password_Enter ラ蕃嶼ラ。 ラ。ラ燮。ラ槞 Password_Go ラァラ沌燮槞! Password_Error1 ラ。ラ燮。ラ槞 ラゥラ潰勉燮 Security_Error1 ラ槞。ラ、ラィ ラ蕃ゥラ「ラィ ラ蕃槞勉潰 ラヲラィラ燮 ラ慵蕃燮勉ェ ラ槞。ラ、ラィ ラ泰燮 1 ラ 65535 Security_Stealth ラ蕃ィラゥラ碩勉ェ ラ隣燮泰勉ィ ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 Security_NoStealthMode ラ慵 (ラ、ラ「ラ勉慵 ラ隣。ラ勉燮) Security_ExplainStats ラ嶼ゥラ碩、ラゥラィラ勉ェ ラ儲 ララ泰隣ィラェ, POPFile ラ槞ェラ隣泰ィラェ ラ碩隣ェ ラ慵燮勉 ラ慵ゥラィラェ getpopfile.org ラ勉槞勉。ラィラェ 3 ラ、ラィラ俎燮: bc (ラ槞。ラ、ラィ ラ蕃槞ヲラ泰勉ィラ燮 ラゥラ燮ゥ ラ慵), mc (ラ槞。ラ、ラィ ラ蕃蕃勉沌「ラ勉ェ ラゥラ蕃ェラ勉嶼ラ ラ。ラ燮勉勉潰), ac (ラ槞。ラ、ラィ ラ俎「ラ勉燮勉ェ ラ蕃。ラ燮勉勉 ラゥラ蕃ェラ勉嶼ラ ラ泰燮ヲラ「ラ). ララェラ勉ラ燮 ラ碩慵 ララゥラ槞ィラ燮 ラ泰ァラ勉泰・, ラ勉碩ラ ラ碩ゥラェラ槞ゥ ラ泰蕃 ラ慵、ラ燮ィラ。ラ勉 ラ。ラ俎俎燮。ラ俎燮ァラ ラ嶼勉慵慵ラ燮ェ ラ「ラ ラ碩燮 ラ碩ラゥラ燮 ラ槞ゥラェラ槞ゥラ燮 ラ泰ェラ勉嶼ラ ラ勉ィラ槞ェ ラ蕃沌燮勉ァ ラゥラ慵. ラ蕃ァラ泰ヲラ燮 ララゥラ槞ィラ燮 ラ5 ラ燮槞燮 ラ泰ゥラィラェ ラ勉ラ槞隣ァラ燮 ラ慵碩隣ィ ラ槞嶼. ラ槞燮沌「 ラ蕃槞ァラゥラィ ラ泰燮 ラ嶼ェラ勉泰ェ ラ IP ラゥラ慵 ラ慵泰燮 ラ蕃。ラ俎俎燮。ラ俎燮ァラ ラ碩燮ラ ララゥラ槞ィ ラ碩 ラ槞、ラ勉ィラ。ラ. Security_ExplainUpdate ラ嶼ゥラ碩、ラゥラィラ勉ェ ラ儲 ララ泰隣ィラェ, POPFile ラ槞ェラ隣泰ィラェ ラ碩隣ェ ラ慵燮勉 ラ慵ゥラィラェ getpopfile.org ラ勉槞勉。ラィラェ 3 ラ、ラィラ俎燮: ma (ラ槞。ラ、ラィ ラ蕃潰燮ィラ。ラ ラ蕃ィラ碩ゥラ ラゥラ POPFile ラ蕃槞勉ェラァララェ ラ泰槞隣ゥラ泰), ma (ラ槞。ラ、ラィ ラ蕃潰燮ィラ。ラ ラ蕃槞ゥララ ラゥラ POPFile ラ蕃槞勉ェラァララェ ラ泰槞隣ゥラ泰), bn (ラ潰燮ィラ。ラェ ラ蕃ァラ勉槞、ラ燮慵ヲラ燮 ラゥラ POPFile ラ蕃槞勉ェラァララェ ラ泰槞隣ゥラ泰).POPFile ラェラァラ泰 ラ槞ゥラ勉 ラ槞蕃ゥラィラェ ラ泰ヲラ勉ィラェ ラ碩燮ァラ勉 ラ潰ィラ、ラ ラ蕃槞ィラ碩 ラ碩 ラァラ燮燮槞ェ ラ潰燮ィラ。ラ ラ隣沌ゥラ ラゥラェラ勉嶼 ラ慵蕃ェラァラ燮. 3 ラ蕃ラェラ勉ラ燮 ララゥラ槞ィラ燮 ラ泰ァラ勉泰・ ラ泰ゥラィラェ. ラ蕃ァラ泰ヲラ燮 ララゥラ槞ィラ燮 ラ5 ラ燮槞燮 ラ泰ゥラィラェ ラ勉ラ槞隣ァラ燮 ラ慵碩隣ィ ラ槞嶼. ラ槞燮沌「 ラ蕃槞ァラゥラィ ラ泰燮 ラ嶼ェラ勉泰ェ ラ IP ラゥラ慵 ラ慵泰燮 ラゥラ慵勉ゥラェ ラ蕃、ラィラ燮俎燮 ラ碩燮ラ ララゥラ槞ィ ラ碩 ラ槞、ラ勉ィラ。ラ. Security_PasswordTitle ラ。ラ燮。ラ槞 ラ慵槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ Security_Password ラ。ラ燮。ラ槞 Security_PasswordUpdate ラ蕃。ラ燮。ラ槞 ラ「ラ勉沌嶼ラ ラ %s Security_AUTHTitle ラ。ラ嶼槞ェ Secure Password Authentication/AUTH Security_SecureServer ラゥラィラェ ラ槞碩勉泰俎 Security_SecureServerUpdate ラ蕃ゥラィラェ ラ蕃槞碩勉泰俎 ラ「ラ勉沌嶼 ラ %s . ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ碩隣ィラ ラゥラェラ碩ェラ隣 ラ碩ェ POPFile ラ槞隣沌ゥ. Security_SecurePort ラゥラ「ラィ ラ槞碩勉泰俎 Security_SecurePortUpdate ラ蕃ゥラ「ラィ ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ Security_POP3 ラ蕃ィラゥラ碩 ラ慵隣燮泰勉ィ POP3 ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 (ラ槞ヲラィラ燮 ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ慵槞ェラ ラェラ勉ァラ」) Security_UI ラ蕃ィラゥラ碩 ラ慵隣燮泰勉ィ HTTP (ラ槞槞ゥラァ ラ蕃槞ゥラェラ槞ゥ) ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 (ラ槞ヲラィラ燮 ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ慵槞ェラ ラェラ勉ァラ」) Security_UpdateTitle ラ泰沌燮ァラェ ラ「ラ沌嶼勉 ラェラ勉嶼ラ ラ碩勉俎勉槞俎燮ェ Security_Update ラ泰ヲラ「 ラ泰沌燮ァラ ラ燮勉槞燮ェ ラ慵「ラ沌嶼勉 ラ蕃ェラ勉嶼ラ Security_StatsTitle ラ沌燮勉勉 ラ。ラ俎俎燮。ラ俎 Security_Stats ラゥラ慵 ラ沌燮勉勉 ラ。ラ俎俎燮。ラ俎 ラ燮勉槞 Security_SMTP ラ蕃ィラゥラ碩 ラ慵隣燮泰勉ィ SMTP ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 (ラ槞ヲラィラ燮 ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ慵槞ェラ ラェラ勉ァラ」) Security_SMTPServer ラゥラィラェ SMTP Security_SMTPPort ラゥラ「ラィ SMTP Security_NNTP ラ蕃ィラゥラ碩 ラ慵隣燮泰勉ィ NNTP ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 (ラ槞ヲラィラ燮 ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ慵槞ェラ ラェラ勉ァラ」) Security_SMTPPortUpdate ラゥラ「ラィ ラゥラィラゥラィラェ SMTP ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ Security_SMTPServerUpdate ラゥラィラェ ラ蕃ゥラィラゥラィラェ ラ SMTP ラ「ラ勉沌嶼 ラ %s. ラ蕃ゥラ燮ラ勉 ラ燮嶼ラ。 ラ慵ェラ勉ァラ」 ラィラァ ラ慵碩隣ィ ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ槞隣沌ゥ Security_XMLRPC ラ蕃ィラゥラ碩 ラ慵隣燮泰勉ィ XML-RPC ラ槞槞隣ゥラ泰燮 ラ碩隣ィラ燮 (ラ槞ヲラィラ燮 ラ碩燮ェラ隣勉 ラ蕃ェラ勉嶼ラ ラ慵槞ェラ ラェラ勉ァラ」) Magnet_Error1 ラ槞潰ラ '%s' ラ嶼泰ィ ラァラ燮燮 ラ泰槞ヲラ泰勉ィ '%s' Magnet_Error2 ラ蕃槞潰ラ ラ蕃隣沌ゥ '%s' ラ槞ェララ潰ゥ ラ「ラ ラ槞潰ラ ラァラ燮燮 '%s' ラ泰槞ヲラ泰勉ィ '%s' ラ勉「ラ慵勉 ラ慵潰ィラ勉 ラ慵ェラ勉ヲラ碩勉ェ ラ沌 ラ槞ゥラ槞「ラ燮勉ェ, ラ勉「ラ ラ嶼 ラ慵 ララゥラ槞ィ. Magnet_Error3 ララァラ泰「 ラ槞潰ラ ラ隣沌ゥ '%s' ラ泰槞ヲラ泰勉ィ '%s' Magnet_CurrentMagnets ラ槞潰ラ「ラ燮 ラァラ燮燮槞燮 Magnet_Message1 ラ槞潰ラ俎燮 ラ碩慵 ラ燮潰ィラ槞 ラ慵。ラ燮勉勉 ラ蕃勉沌「ラ勉ェ ラ碩 ラ槞ヲラ泰勉ィ '%s' ラェラ槞燮. Magnet_CreateNew ラァラ泰「 ラ槞潰ラ ラ隣沌ゥ Magnet_Explanation ラァラ燮燮槞燮 3 ラ。ラ勉潰 ラ槞潰ラ俎燮:

  • 'ララゥラ慵 ラ' ラ嶼ェラ勉泰ェ ラ碩 ラゥラ: ラ慵沌勉潰槞: john@company.com ラ慵槞潰ラ勉 ラ嶼ェラ勉泰ェ ラ。ラ、ラヲラ燮、ラ燮ェ,
    company.com ラ慵槞潰ラ勉 ラ嶼 ラ嶼ェラ勉泰ェ ラ槞蕃隣泰ィラ company.com,
    John Doe ラ慵槞燮潰ラ勉 ラゥラ ラ槞。ラ勉燮,
    John ラ慵槞潰ラ勉 ラ嶼 ラ槞 ラゥラゥラ槞 John
  • ラ慵ゥラ ラ碩 ラ嶼ェラ勉泰ェ:ラ嶼槞 'ララゥラ慵 ラ' ラ碩泰 ラ泰ゥラ沌 'ララゥラ慵 ラ' ラ泰蕃勉沌「ラ
  • ラ槞燮慵勉ェ ララ勉ゥラ: ラ慵沌勉潰槞: ラゥラ慵勉 ラ燮槞潰ラ ラ嶼 ラ蕃勉沌「ラ ラ泰 ラ槞勉、ラ燮「ラ ラ蕃槞燮慵 ラゥラ慵勉 ラ泰ラ勉ゥラ ラ蕃蕃勉沌「ラ
Magnet_MagnetType ラ。ラ勉 ラ蕃槞潰ラ Magnet_Value ラェラ勉嶼 ラ蕃槞潰ラ Magnet_Always ラ。ラ勉勉 ラェラ槞燮 ラ碩 ラェラ勉 ラ槞ヲラ泰勉ィ Magnet_Jump ラァラ燮ゥラ勉ィ ラ慵沌」 ラ蕃槞潰ラ俎燮 Bucket_Error1 ラゥラ ラ槞ヲラ泰勉ィ ラ燮嶼勉 ラ慵蕃嶼燮 ラ碩勉ェラ燮勉ェ ラ慵勉「ラ儲燮勉ェ ラ泰慵泰 ラ勉碩ェ ラ蕃ェラ勉勉燮 - ラ _ Bucket_Error2 ラ槞ヲラ泰勉ィ ラ泰ゥラ '%s' ラ嶼泰ィ ラァラ燮燮 Bucket_Error3 ラ槞ヲラ泰勉ィ ラ泰ゥラ '%s' ララ勉ヲラィ ラ勉ラゥラ槞ィ Bucket_Error4 ラ燮ゥ ラ慵蕃儲燮 ラ槞燮慵 ラ嶼慵ゥラ蕃 Bucket_Error5 ラゥラ ラ蕃槞ヲラ泰勉ィ '%s' ラゥラ勉ラ ラ '%s' Bucket_Error6 ラ槞ヲラ泰勉ィ '%s' ララ槞隣ァ Bucket_Title Bucket_BucketName ラゥラ ラ槞ヲラ泰勉ィ Bucket_WordCount ラ槞。ラ、ラィ ラ槞燮慵燮 Bucket_WordCounts ラ槞。ラ、ラィラ ラ槞燮慵燮 Bucket_UniqueWords ラ槞燮慵燮 ラ燮燮隣勉沌燮勉ェ Bucket_SubjectModification ラゥラ燮ラ勉 ラゥラ勉ィラェ ララ勉ゥラ Bucket_ChangeColor ラゥララ ラヲラ泰「 Bucket_NotEnoughData ラ槞燮沌「 ラ隣。ラィ Bucket_ClassificationAccuracy ラ槞燮沌ェ ラ沌燮勉ァ ラ蕃。ラ燮勉勉 Bucket_EmailsClassified ラ蕃勉沌「ラ勉ェ ラゥラ。ラ勉勉潰 Bucket_EmailsClassifiedUpper ラ蕃勉沌「ラ勉ェ ラゥラ。ラ勉勉潰 Bucket_ClassificationErrors ラ俎「ラ勉燮勉ェ ラ泰。ラ燮勉勉 Bucket_Accuracy ラ槞燮沌ェ ラ蕃沌燮勉ァ Bucket_ClassificationCount ラ槞。ラ、ラィ ラ。ラ燮勉勉潰燮 Bucket_ResetStatistics ラ碩燮、ラ勉。 ラ。ラ俎俎燮。ラ俎燮ァラ Bucket_LastReset ラ碩燮、ラ勉。 ラ碩隣ィラ勉 Bucket_CurrentColor '%s' ラヲラ泰「 ラ嶼「ラェ '%s' Bucket_SetColorTo ラァラ泰「 ラヲラ泰「 '%s' ラ '%s' Bucket_Maintenance ラェラ隣儲勉ァラ Bucket_CreateBucket ラ蕃勉。ラ」 ラ槞ヲラ泰勉ィ ラ泰ゥラ Bucket_DeleteBucket ラ槞隣ァ ラ槞ヲラ泰勉ィ ラ儲 Bucket_RenameBucket ラゥララ ラゥラ ラ槞ヲラ泰勉ィ ラ泰ゥラ Bucket_Lookup ラ槞ヲラ ラ泰槞ヲラ泰勉ィ Bucket_LookupMessage ラ槞ヲラ ラ槞燮慵燮 ラ泰槞ヲラ泰勉ィラ燮 Bucket_LookupMessage2 ラェラ勉ヲラ碩勉ェ ラ隣燮、ラ勉ゥ ラゥラ: Bucket_LookupMostLikely %s ラ燮槞ヲラ ラァラィラ勉 ラ慵勉沌碩 ラ泰槞ヲラ泰勉ィ %s Bucket_DoesNotAppear

%s ラ慵 ラ槞勉、ラ燮「 ラ泰碩」 ラ碩隣 ラ槞 ラ蕃槞ヲラ泰勉ィラ燮 Bucket_DisabledGlobally ララ勉俎ィラ ラ嶼慵燮 Bucket_To ラ: Bucket_Quarantine ラ泰燮沌勉 Bucket_ClassificationFN ラ。ラ燮勉勉 ラ隣燮勉泰 ラ槞勉俎「ラ Bucket_ClassificationFP ラ。ラ燮勉勉 ラゥラ慵燮慵 ラ槞勉俎「ラ SingleBucket_Title ラ、ラ燮ィラ勉 %s SingleBucket_WordCount ラ槞。ラ、ラィ ラ蕃槞燮慵燮 ラ泰槞ヲラ泰勉ィ SingleBucket_TotalWordCount ラ槞。ラ、ラィ ラ蕃槞燮慵燮 ラ嶼勉慵 SingleBucket_Percentage ラ碩隣勉 ラ槞。ラ ラ嶼勉慵 SingleBucket_WordTable ラ俎泰慵ェ ラ蕃槞燮慵燮 ラ '%s' SingleBucket_Message1 ラ蕃。ラ燮勉勉 ラ蕃ゥラェラ槞ゥ ララ槞燮慵燮 ラ蕃槞。ラ勉槞ラ勉ェ ラ '*'. ラ慵隣・ ラ「ラ ラ槞燮慵 ラ泰嶼沌 ラ慵ィラ碩勉ェ ラ碩ェ ラ蕃蕃。ラェラ泰ィラ勉ェ ラゥラ慵 ラ泰嶼 ラ蕃槞ヲラ泰勉ィラ燮. SingleBucket_Unique ラ燮燮隣勉沌燮燮勉ェ %s SingleBucket_ClearBucket ラ槞隣燮ァラェ ラ嶼 ラ蕃槞燮慵燮 ラ泰槞ヲラ泰勉ィ ラ儲 Session_Title ラ、ラ ラェラ勉ァラ」 ラ蕃隣燮泰勉ィ ラ POPFile Session_Error ラェラ勉ァラ」 ラ蕃隣燮泰勉ィ ラゥラ慵 ラ POPFile ラ、ラ. ラ蕃。ラ燮泰 ラ「ラゥラ勉燮 ラ慵蕃燮勉ェ ラゥラ蕃沌、ラ沌、ラ ララゥラ碩ィ ラ、ラェラ勉, ラ碩 ラ蕃ェラ勉嶼ラ ラ碩勉ェラ隣慵 )ラ嶼勉泰ェラ ラゥラ勉潰ィラ ラ槞隣沌ゥ(. ラ慵隣・ ラ「ラ ラ碩隣 ラ槞蕃ァラ燮ゥラ勉ィラ燮 ラ慵槞「ラ慵 ラ嶼沌 ラ慵蕃槞ゥラ燮 ラ碩ェ ラ蕃ゥラ燮槞勉ゥ. Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'needs to be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which ラ槞ヲラ泰勉ィラ燮, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of ラ蕃勉沌「ラ勉ェ ラ。ラ勉勉潰, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it needs automatically check for updates to the program, and whether statistics about POPFile's performance needs be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Francais.msg0000664000175000017500000007305111624177330017563 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode fr LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage fr # Common words that are used on their own all over the interface Apply Appliquer On Actif Off Inactif TurnOn Activer TurnOff D駸activer Add Ajouter Remove Retirer Previous Pr馗馘ent Next Suivant From De Subject Sujet Cc Cc Classification Classification Reclassify Reclassifier Probability Probabilit Scores Scores QuickMagnets Aimants rapides Undo Annuler Close Fermer Find Chercher Filter Filtrer Yes Oui No Non ChangeToYes Passer Oui ChangeToNo Passer Non Bucket Cat馮orie Magnet Aimant Delete Supprimer Create Cr馥r To A Total Total Rename Renommer Frequency Fr駲uence Probability Probabilit Score Score Lookup Consulter Word Mot Count Compteur Update Mettre jour Refresh Actualiser FAQ FAQ ID ID Date Date Arrived Arriv Size Taille # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands " " Locale_Decimal , # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %d/%m %R | %d/%m/%Y %R # The header and footer that appear on every UI page Header_Title Centre de Commande de POPFile Header_Shutdown Arr黎er POPFile Header_History Historique Header_Buckets Cat馮ories Header_Configuration Configuration Header_Advanced Avanc Header_Security S馗urit Header_Magnets Aimants Footer_HomePage Site web de POPFile Footer_Manual Manuel Footer_Forums Forums Footer_FeedMe Encouragez-moi! Footer_RequestFeature Demande d'騅olution Footer_MailingList Liste de diffusion Footer_Wiki Documentation additionnelle Configuration_Error1 Le caract鑽e s駱arateur doit 黎re un unique caract鑽e Configuration_Error2 Le port de l'interface utilisateur doit 黎re un nombre compris entre 1 et 65535 Configuration_Error3 Le port d'馗oute POP3 doit 黎re un nombre compris entre 1 et 65535 Configuration_Error4 La taille de page doit 黎re un nombre compris entre 1 et 1000 Configuration_Error5 Le nombre de jours d'historique doit 黎re un nombre compris entre 1 et 366 Configuration_Error6 Le d駘ai d'expiration TCP doit 黎re un nombre compris entre 10 et 1800 Configuration_Error7 Le port d'馗oute XML-RPC doit 黎re un nombre compris entre 1 et 65535 Configuration_Error8 Le port du proxy SOCKS V doit 黎re un nombre compris entre 1 et 65535 Configuration_POP3Port Port d'馗oute POP3 Configuration_POP3Update Port pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Configuration_XMLRPCUpdate Le port XML-RPC est pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Configuration_XMLRPCPort Port d'馗oute XML-RPC Configuration_SMTPPort Port d'馗oute SMTP Configuration_SMTPUpdate Le port SMTP est pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Configuration_NNTPPort Port d'馗oute NNTP Configuration_NNTPUpdate Le port NNTP est pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Configuration_POPFork Autorise plusieurs connexions POP3 simultan馥s Configuration_SMTPFork Autorise plusieurs connexions SMTP simultan馥s Configuration_NNTPFork Autorise plusieurs connexions NNTP simultan馥s Configuration_POP3Separator Caract鑽e de s駱aration pour hte:port:utilisateur POP3 Configuration_NNTPSeparator Caract鑽e de s駱aration pour hte:port:utilisateur NNTP Configuration_POP3SepUpdate Le s駱arateur POP3 est pass %s Configuration_NNTPSepUpdate Le s駱arateur NNTP est pass %s Configuration_UI Port web d'interface utilisateur Configuration_UIUpdate Port web d'interface utilisateur pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Configuration_History Nombre de messages par page Configuration_HistoryUpdate Nombre de messages par page pass %s Configuration_Days Nombre de jours d'historique conserver Configuration_DaysUpdate Nombre de jours d'historique pass %s Configuration_UserInterface Interface Utilisateur Configuration_Skins Apparences Configuration_SkinsChoose Choisir une apparence Configuration_Language Langue Configuration_LanguageChoose Choisir une langue Configuration_ListenPorts Ports d'Ecoute Configuration_HistoryView Pages d'Historique Configuration_TCPTimeout D駘ai d'Expiration de Connexion TCP Configuration_TCPTimeoutSecs D駘ai d'expiration de connexion TCP en secondes Configuration_TCPTimeoutUpdate D駘ai d'expiration de connexion TCP pass %s Configuration_ClassificationInsertion Informations de Classification Configuration_SubjectLine Modification de la ligne Sujet Configuration_XTCInsertion Insertion de X-Text-Classification Configuration_XPLInsertion Insertion de X-POPFile-Link Configuration_Logging Journalisation Configuration_None aucune Configuration_ToScreen l'馗ran Configuration_ToFile dans un fichier Configuration_ToScreenFile 馗ran et fichier Configuration_LoggerOutput Sortie Configuration_GeneralSkins Habillages Configuration_SmallSkins Habillages compacts Configuration_TinySkins Habillages ultra-compacts Configuration_CurrentLogFile <T駘馗harger le fichier journal en cours> Configuration_SOCKSServer Hte du proxy SOCKS V Configuration_SOCKSPort Port du proxy SOCKS V Configuration_SOCKSPortUpdate Le port du proxy SOCKS V est pass %s Configuration_SOCKSServerUpdate L'hte du proxy SOCKS V est pass %s Configuration_Fields Colonnes de l'historique Advanced_Error1 '%s' est d駛 dans la liste des mots ignor駸 Advanced_Error2 Les mots ignor駸 ne peuvent contenir que des caract鑽es alphanum駻iques ou ., _, -, @ Advanced_Error3 '%s' ajout la liste des mots ignor駸 Advanced_Error4 '%s' n'est pas dans la liste des mots ignor駸 Advanced_Error5 '%s' retir de la liste des mots ignor駸 Advanced_StopWords Mots ignor駸 Advanced_Message1 Les mots suivants sont ignor駸 dans toutes les classifications car ils apparaissent tr鑚 souvent. Advanced_AddWord Ajouter un mot Advanced_RemoveWord Retirer un mot Advanced_AllParameters Tous les param鑼res de POPFile Advanced_Parameter Param鑼re Advanced_Value Valeur Advanced_Warning Ceci est la liste compl鑼e des param鑼res de POPFile. Utilisateurs avertis seulement: vous pouvez modifier ceux que vous d駸irez et cliquer Actualiser. Aucune v駻ification de validit n'est effectu馥. Les 駘駑ents diff駻ents des valeurs par d馭aut sont 馗rits en caract鑽es gras. Advanced_ConfigFile Fichier de configuration : History_Filter  (ne montrant que la cat馮orie %s) History_FilterBy Filtrer selon History_Search  (recherche du sujet %s) History_Title Messages r馗ents History_Jump Aller au message History_ShowAll Tout afficher History_ShouldBe Devrait 黎re History_NoFrom pas de ligne De History_NoSubject pas de ligne Sujet History_ClassifyAs Classifi comme History_MagnetUsed Aimant utilis History_MagnetBecause Aimant utilis

Classifi comme %s par l'aimant %s

History_ChangedTo Chang en %s History_Already D駛 reclassifi comme %s History_RemoveAll Supprimer tout History_RemovePage Supprimer page History_RemoveChecked Supprimer les messages coch駸 History_Remove Pour supprimer des entr馥s dans l'historique cliquez History_SearchMessage Chercher De/Sujet History_NoMessages Pas de messages History_ShowMagnet Aimant History_Negate_Search Inverser la recherche ou le filtre History_Magnet  (ne montrant que les messages classifi駸 par aimant) History_NoMagnet  (ne montrant que les messages non classifi駸 par aimant) History_ResetSearch Initialiser History_ChangedClass Devrait maintenant 黎re classifi comme History_Purge Supprimer maintenant History_Increase Croissant History_Decrease D馗roissant History_Column_Characters Changer la largeur des colonnes De, A, Cc et Sujet History_Automatic Automatique History_Reclassified Reclassifi History_Size_Bytes %d octets History_Size_KiloBytes %.1f Ko History_Size_MegaBytes %.1f Mo Password_Title Mot de Passe Password_Enter Entrez le mot de passe Password_Go Continuer Password_Error1 Mot de passe incorrect Security_Error1 Le port s馗uris doit 黎re un nombre compris entre 1 et 65535 Security_Stealth Mode Furtif/Fonctionnement du Serveur Security_NoStealthMode Non (Mode Furtif) Security_StealthMode (Mode Furtif) Security_ExplainStats (Quand ceci est activ POPFile envoie une fois par jour les trois valeurs suivantes un script getpopfile.org: bc (le nombre total de vos cat馮ories), mc (le nombre total de messages classifi駸 par POPFile) et ec (le nombre total d'erreurs de classification). Elles sont alors stock馥s dans un fichier que j'utiliserai pour publier quelques statistiques sur comment les gens utilisent POPFile et si 軋 marche bien. Mon serveur web conserve ses fichiers log pendant environ 5 jours puis les efface; je ne recueille aucun lien entre les statisques et les adresses IP individuelles.) Security_ExplainUpdate (Quand ceci est activ POPFile envoie une fois par jour les trois valeurs suivantes un script getpopfile.org: ma (le num駻o de version principal de votre POPFile), mi (le num駻o de version secondaire de votre POPFile) et bn (le num駻o de compilation de votre POPFile). POPFile re輟it une r駱onse sous la forme d'un graphique qui apparat en haut de la page si une version plus r馗ente est disponible. Mon serveur web conserve ses fichiers log pendant environ 5 jours puis les efface; je ne recueille aucun lien entre les contrles de mise jour et les adresses IP individuelles.) Security_PasswordTitle Mot de passe de l'interface utilisateur Security_Password Mot de passe Security_PasswordUpdate Mot de passe chang en %s Security_AUTHTitle Authentification par mot de passe s馗uris/AUTH Security_SecureServer Serveur s馗uris Security_SecureServerUpdate Serveur s馗uris pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Security_SecurePort Port s馗uris Security_SecurePortUpdate Port s馗uris pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Security_SMTPServer Serveur de chaine SMTP Security_SMTPServerUpdate Serveur de chaine SMTP pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Security_SMTPPort Port de la chaine SMTP Security_SMTPPortUpdate Port de la chaine SMTP pass %s; ce changement ne prendra effet qu'au prochain red駑arrage de POPFile Security_POP3 Accepter les connexions POP3 de machines distantes Security_SMTP Accepter les connexions SMTP de machines distantes (n馗essite le red駑arrage de POPFile) Security_NNTP Accepter les connexions NNTP de machines distantes (n馗essite le red駑arrage de POPFile) Security_UI Accepter les connexions HTTP (Interface Utilisateur) de machines distantes Security_XMLRPC Accepter les connexions XML-RPC de machines distantes (n馗essite le red駑arrage de POPFile) Security_UpdateTitle Contrle automatique de mise jour Security_Update V駻ifier quotidiennement les mises jour de POPFile Security_StatsTitle Compte-rendu de statistiques Security_Stats Envoyer quotidiennement des statistiques John Magnet_Error1 L'aimant '%s' existe d駛 pour la cat馮orie '%s' Magnet_Error2 Le nouvel aimant '%s' interf鑽e avec l'aimant '%s' de la cat馮orie '%s' et pourrait causer des r駸ultats ambigs. Le nouvel aimant n'est pas ajout. Magnet_Error3 Nouvel aimant '%s' cr鳬 pour la cat馮orie '%s' Magnet_CurrentMagnets Aimants actuels Magnet_Message1 Les aimants suivants entranent la classification syst駑atique d'un message dans la cat馮orie sp馗ifi馥. Magnet_CreateNew Cr馥r un nouvel aimant Magnet_Explanation Trois types d'aimants sont disponibles:
  • Adresse ou nom de l'exp馘iteur: Par exemple: john@company.com pour capter une adresse sp馗ifique,
    company.com pour capter les messages de tous les exp馘iteurs de company.com,
    John Doe pour capter une personne en particulier, John pour capter tous les John
  • Adresse ou nom du destinataire: Comme un aimant De: mais pour l'adresse du destinataire du message
  • Mots du sujet: Par exemple: bonjour pour capter tous les messages avec bonjour dans le sujet
Magnet_MagnetType Type d'aimant Magnet_Value Valeur Magnet_Always Toujours envoyer dans la cat馮orie Magnet_Jump Aller la page des aimants Bucket_Error1 Les noms de cat馮ories ne peuvent contenir que les minuscules de a z ainsi que - et _ Bucket_Error2 La cat馮orie nomm馥 %s existe d駛 Bucket_Error3 Cat馮orie nomm馥 %s cr鳬e Bucket_Error4 Veuillez entrer un mot non vide Bucket_Error5 Cat馮orie %s renomm馥 en %s Bucket_Error6 Cat馮orie %s effac馥 Bucket_Title R駸um Bucket_BucketName Nom de cat馮orie Bucket_WordCount Nombre de mots Bucket_WordCounts Nombres de Mots Bucket_UniqueWords Mots distincts Bucket_SubjectModification Modification du sujet Bucket_ChangeColor Changer la couleur Bucket_NotEnoughData Pas assez de donn馥s Bucket_ClassificationAccuracy Performance de Classification Bucket_EmailsClassified Messages classifi駸 Bucket_EmailsClassifiedUpper Messages Classifi駸 Bucket_ClassificationErrors Erreurs de classification Bucket_Accuracy Performance Bucket_ClassificationCount Nombre de classifications Bucket_ClassificationFP Faux Positifs Bucket_ClassificationFN Faux N馮atifs Bucket_ResetStatistics Initialiser les statisques Bucket_LastReset Derni鑽e initialisation Bucket_CurrentColor La couleur actuelle de %s est %s Bucket_SetColorTo Changer la couleur de %s en %s Bucket_Maintenance Maintenance Bucket_CreateBucket Cr馥r une cat馮orie nomm馥 Bucket_DeleteBucket Effacer la cat馮orie nomm馥 Bucket_RenameBucket Renommer la cat馮orie nomm馥 Bucket_Lookup Examiner Bucket_LookupMessage Examiner le mot dans les cat馮ories Bucket_LookupMessage2 Examiner le r駸ultat pour Bucket_LookupMostLikely %s a le plus de chance d'apparatre dans %s Bucket_DoesNotAppear

%s n'apparat dans aucune cat馮orie Bucket_DisabledGlobally D駸activ globalement Bucket_To en Bucket_Quarantine Mise en quarantaine SingleBucket_Title D騁ail pour %s SingleBucket_WordCount Nombre de mots de la cat馮orie SingleBucket_TotalWordCount Nombre total de mots SingleBucket_Percentage Pourcentage du total SingleBucket_WordTable Table des mots pour %s SingleBucket_Message1 Les mots signal駸 (*) ont 騁 utilis駸 pour la classification dans cette session POPFile. Cliquez sur un mot pour examiner sa probabilit dans toutes les cat馮ories. SingleBucket_Unique %s seul SingleBucket_ClearBucket Supprimer tous les mots Session_Title Session POPFile expir馥 Session_Error Votre session POPFile a expir. Cela peut 黎re d un arr黎/relance de POPFile alors que le navigateur est rest ouvert. Veuillez cliquer sur l'un des liens ci-dessus pour continuer utiliser POPFile. View_Title Vue d'un message View_ShowFrequencies Voir les fr駲uences des mots View_ShowProbabilities Voir les probabilit駸 des mots View_ShowScores Voir les scores des mots et la table de d馗ision View_WordMatrix Matrice des mots View_WordProbabilities Probablit des mots View_WordFrequencies Fr駲uence des mots View_WordScores Score des mots View_Chart Table de d馗ision Windows_TrayIcon Montrer l'icne de POPFile dans la zone de notification de Windows ? Windows_Console Lancer POPFile dans une fen黎re console ? Windows_NextTime

Cette modification sera prise en compte apr鑚 le prochain d駑arrage de POPFile Header_MenuSummary Cette page est le menu de navigation qui donne acc鑚 aux diff駻entes pages du centre de contrle. History_MainTableSummary Cette table montre l'exp馘iteur et le sujet des messages re輹s r馗emment, et permet de les visionner et de les reclassifier. Cliquez sur la ligne du sujet pour voir l'int馮ralit du message ainsi que des informations sur la classification qui a 騁 effectu馥. La colonne 'devrait 黎re' vous permet de sp馗ifier quelle cat馮orie le message appartient, ou d'annuler cette modification. La colonne 'Supprimer' vous permet de supprimer de l'historique les messages dont vous n'avez plus besoin. History_OpenMessageSummary Cette table contient le texte complet d'un message 駘ectronique, chaque mot utilis lors de la classification 騁ant color en fonction de la cat馮orie laquelle il se rapporte le plus. Bucket_MainTableSummary Cette table fournit un aper輹 des cat馮ories. Sur chaque ligne, le nom de la cat馮orie, le total des compteurs des mots de la cat馮orie, le nombre de mots uniques, le r馮lage de la modification du sujet si un message est classifi dans cette cat馮orie, le r馮lage de la mise en quarantaine des messages classifi駸 dans cette cat馮orie, et une table permettant de choisir la couleur associ馥 cette cat馮orie, utilis馥 pour afficher tout ce qui est relatif cette derni鑽e dans le centre de contrle. Bucket_StatisticsTableSummary Cette table fournit trois valeurs statistiques sur les performance g駭駻ales de POPFile. La premi鑽e donne le taux de r騏ssite de la classification, la seconde combien de messages ont 騁 classifi駸 et dans quelles cat馮ories, et la troisi鑪e combien de mots sont pr駸ents dans chaque cat馮orie, avec leurs pourcentages relatifs. Bucket_MaintenanceTableSummary Cette table contient des formulaires qui vous permettent de cr馥r, supprimer ou renommer les cat馮ories, et rechercher un mot dans toutes les cat馮ories pour v駻ifier ses probabilit駸 relatives. Bucket_AccuracyChartSummary Cette table repr駸ente graphiquement le taux de r騏ssite de la classification des messages. Bucket_BarChartSummary Cette table repr駸ente graphiquement la taille relative de chaque cat馮orie. Elle est utilis馥 aussi bien pour le nombre de messages classifi駸 que pour le total des compteurs de mots. Bucket_LookupResultsSummary Cette table montre les probabilit駸 associ馥s chaque mot donn du corpus. Pour chaque cat馮orie, elle montre la fr駲uence laquelle le mot est rencontr, la probabilit qu'il a d'appartenir cette cat馮orie, et l'effet global sur le score de cette cat馮orie si le mot est rencontr dans un message. Bucket_WordListTableSummary Cette table fournit une liste de tous les mots d'une cat馮orie donn馥, class駸 en fonction de leur premi鑽e lettre. Magnet_MainTableSummary Cette table montre la liste des aimants utilis駸 pour classifier automatiquement des messages en fonction de r鑒les fixes. Chaque ligne montre comment l'aimant est d馭ini, quelle cat馮orie il est assign, ainsi qu'un bouton permettant de supprimer l'aimant. Configuration_MainTableSummary Cette table contient un certain nombre de formulaires vous permettant de contrler la configuration de POPFile. Configuration_InsertionTableSummary Cette table contient des boutons qui d騁erminent si certaines modifications doivent 黎re apport馥s aux en-t黎es ou la ligne de sujet du message avant qu'il soit transmis au client de messagerie. Security_MainTableSummary Cette table permet de contrler les param鑼res de s馗urit de la configuration g駭駻ale de POPFile, de d馗ider s'il doit v駻ifier automatiquement les mises jour du programme, et si les statistiques de performance de POPFile doivent 黎re transmises au serveur de donn馥s central de l'auteur du programme des fins d'information g駭駻ale. Advanced_MainTableSummary Cette table fournit une liste de mots que POPFile ignore lors de la classification des messages, 騁ant donn leur trop grande possibilit de pr駸ence dans les messages de tout type. Ils sont class駸 en fonction de leur premi鑽e lettre. Imap_Bucket2Folder Les messages de la cat馮orie %s vont dans le dossier Imap_MapError Vous ne pouvez pas assigner plus d'une cat馮orie un m麥e dossier ! Imap_Server Nom du serveur IMAP : Imap_ServerNameError Veuillez entrer le nom du serveur ! Imap_Port Port du serveur IMAP Imap_PortError Veuillez entrer un num駻o de port valide ! Imap_Login Nom de compte IMAP : Imap_LoginError Veuillez entrer un nom de compte ! Imap_Password Mot de passe du compte IMAP : Imap_PasswordError Veuillez entrer un mot de passe pour le serveur ! Imap_Expunge Effacer les messages supprim駸 des dossiers surveill駸 Imap_Interval P駻iode de rafrachissement en secondes : Imap_IntervalError Veuillez entrer un d駘ai compris entre 10 et 3600 secondes. Imap_Bytelimit Par message, nombre d'octets pris en compte pour la classification. Entrez 0 (z駻o) pour le message complet : Imap_BytelimitError Veuillez entrer un nombre. Imap_RefreshFolders Actualiser la liste des dossiers Imap_Now maintenant ! Imap_UpdateError1 Impossible de s'identifier. Veuillez v駻ifier votre nom de compte et votre mot de passe. Imap_UpdateError2 Impossible de se connecter au serveur. Veuillez v駻ifier le nom du serveur et le port, et vous assurer que vous 黎re en ligne. Imap_UpdateError3 Veuillez configurer pr饌lablement les d騁ails de la connexion. Imap_NoConnectionMessage Veuillez configurer pr饌lablement les d騁ails de la connexion. Une fois cela fait, d'avantage d'options seront disponibles sur cette page. Imap_WatchMore un dossier la liste des dossiers surveill駸 Imap_WatchedFolder Dossier surveill nー Shutdown_Message POPFile s'est arr黎 Help_Training Lorsque vous utilisez POPFile pour la premi鑽e fois, il ne connait rien et a besoin d'un apprentissage. POPFile a besoin d'黎re entran avec des messages appartenant chaque cat馮orie, cet apprentissage ayant lieu quand vous reclassifiez un message que POPFile a mal class. Vous devez 馮alement configurer votre client de messagerie pour filtrer les messages en fonction de la classification effectu馥 par POPFile. Pour plus de renseignements sur la mise en place du filtrage dans les clients de messagerie, consultez : POPFile Documentation Project (en Anglais). Help_Bucket_Setup POPFile a besoin d'au moins deux cat馮ories en plus de la pseudo-cat馮orie 'unclassified'. Ce qui rend POPFile unique est qu'il peut classifier les messages dans autant de cat馮orie que vous le d駸irez. Une configuration simple pourrait 黎re une cat馮orie "spam", une autre "personnel" et une autre "professionnel" Help_No_More Ne plus montrer ceci popfile-1.1.3+dfsg/languages/Espanol.msg0000664000175000017500000005720411624177330017440 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode es LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage es # Common words that are used on their own all over the interface Apply Aplicar On Activo Off Inactivo TurnOn Activar TurnOff Desactivar Add Aadir Remove Quitar Previous Previa Next Seguir From De Subject Asunto Cc Cc Classification Clasificacin Reclassify Reclasificar Probability Probabilidad Scores Puntuaciones QuickMagnets Superimanes Undo Deshacer Close Cerrar Find Buscar Filter Filtro Yes Si No No ChangeToYes cambiar a S ChangeToNo cambiar a No Bucket Categora Magnet Im疣 Delete Borrar Create Crear To Para Total Total Rename Renombrar Frequency Frequencia Probability Probabilidad Score Puntuacin Lookup Bsqueda Word Palabra Count Cuenta Update Actualizar Refresh Refrescar # The header and footer that appear on every UI page Header_Title POPFile - Centro de Control Header_Shutdown Apagar POPFile Header_History Historial Header_Buckets Categoras Header_Configuration Configuracin Header_Advanced Avanzado Header_Security Seguridad Header_Magnets Imanes Footer_HomePage P疊ina Web de POPFile Footer_Manual Manual Footer_Forums Foros Footer_FeedMe Donar Footer_RequestFeature Pedir Caracterstica Footer_MailingList Lista de Correo Configuration_Error1 El car當ter separador tiene que ser uno solo Configuration_Error2 El puerto del GUI tiene que ser un nコ entre 1 y 65535 Configuration_Error3 El puerto de escucha POP3 tiene que ser un nコ entre 1 y 65535 Configuration_Error4 El tamao de la p疊ina tiene que ser un nコ entre 1 y 1000 Configuration_Error5 El nコ de dias en el historial tiene que ser un nコ entre 1 y 366 Configuration_Error6 La temporizacin TCP debe ser un nコ entre 10 y 1800 Configuration_Error7 El puerto de escucha XML RPC listen debe ser un nmero entre 1 y 65535 Configuration_POP3Port Puerto de escucha POP3 Configuration_POP3Update Puerto actualizado a %s; este cambio ser efectivo al siguiente reinicio de POPFile Configuration_XMLRPCUpdate Puerto XML-RPC actualizado a %s; este cambio ser efectivo en el siguiente arranque de POPFile Configuration_XMLRPCPort Puerto de escucha XML-RPC Configuration_SMTPPort Puerto de escucha SMTP Configuration_SMTPUpdate Puerto SMTP actualizado a %s; este cambio ser efectivo en el siguiente arranque de POPFile Configuration_NNTPPort Puerto de escucha NNTP Configuration_NNTPUpdate Puerto NNTP actualizado a %s; este cambio ser efectivo en el siguiente arranque de POPFile Configuration_POPFork Permitir conexiones concurrentes POP3 Configuration_SMTPFork Permitir conexiones concurrentes SMTP Configuration_NNTPFork Permitir conexiones concurrentes NNTP Configuration_POP3Separator POP3 host:puerto:usuario caracter separador Configuration_NNTPSeparator NNTP host:puerto:usuario caracter separador Configuration_POP3SepUpdate Separador POP3 actualizado a %s Configuration_NNTPSepUpdate Separador NNTP actualizado a %s Configuration_UI Puerto web del interface de Usuario Configuration_UIUpdate El puerto web del interface de usuario ha sido actualizado a %s ; este cambio ser efectivo en el siguiente reinicio de POPFile Configuration_History Nmero de correos por p疊ina Configuration_HistoryUpdate Nコ de correos por p疊ina actualizado a %s Configuration_Days Nコ de dias que se guarda el historial Configuration_DaysUpdate Actualizado el nmero de das en historial a %s Configuration_UserInterface Interface de Usuario Configuration_Skins Apariencias Configuration_SkinsChoose Elegir una apariencia Configuration_Language Lenguaje Configuration_LanguageChoose Elegir lenguaje Configuration_ListenPorts Puertos de escucha Configuration_HistoryView Vista de Historial Configuration_TCPTimeout Temporizacin de la conexin TCP Configuration_TCPTimeoutSecs Temporizacin en segundos Configuration_TCPTimeoutUpdate Temporizacin de la conexin TCP establecida en %s Configuration_ClassificationInsertion Insercin de texto en E-Mail Configuration_SubjectLine Modificar la lnea de
asunto Configuration_XTCInsertion Insertar la
cabecera X-Text-Classification Configuration_XPLInsertion Insertar la
cabecera X-POPFile-Link Configuration_Logging Registro Configuration_None Nada Configuration_ToScreen A Pantalla Configuration_ToFile A Fichero Configuration_ToScreenFile A Pantalla y Fichero Configuration_LoggerOutput Salida Configuration_GeneralSkins Apariencias Configuration_SmallSkins Apariencias pequeas Configuration_TinySkins Apariencias enanas Configuration_CurrentLogFile <arch. de registro actual> Advanced_Error1 '%s' ya est en la lista de palabras ignoradas Advanced_Error2 Las palabras ignoradas solo pueden contener caracteres alfanum駻icos, ., _, -, @ Advanced_Error3 '%s' aadida a la lista de palabras ignoradas Advanced_Error4 '%s' no est en la lista de palabras ignoradas Advanced_Error5 '%s' quitada de la lista de palabras ignoradas Advanced_StopWords Palabras Ignoradas Advanced_Message1 POPFile ignora las siguientes palabras de uso frecuente: Advanced_AddWord Aadir palabra Advanced_RemoveWord Quitar palabra Advanced_AllParameters Todos los Parametros de POPFile Advanced_Parameter Parametro Advanced_Value Valor Advanced_Warning Esta es la lista completa de los parametros de POPFile. Solo para usuarios avanzados: puedes cambiar cualquiera y pinchar en Actualizar; no hay comprobacion para validarlos. History_Filter  (mostrando slo la categora %s) History_FilterBy Filtrar Por History_Search  (buscando en de/asunto %s) History_Title Mensajes Recientes History_Jump Ir al mensaje History_ShowAll Mostrar Todo History_ShouldBe Debera ser History_NoFrom sin lnea de History_NoSubject sin lnea de asunto History_ClassifyAs Clasificar como History_MagnetUsed Im疣 utilizado History_MagnetBecause Iman usado

Clasificado a %s por el iman %s

History_ChangedTo Cambiado a %s History_Already Anteriormente clasificado como %s History_RemoveAll Quitar Todo History_RemovePage Quitar P疊ina History_Remove Para borrar las entradas en el historial clic History_SearchMessage Buscar De/Asunto History_NoMessages Sin mensajes History_ShowMagnet magnetizado History_ShowNoMagnet desmagnetizado History_Magnet  (mostrando solo mensajes clasificados por im疣) History_NoMagnet  (Mostrando slo mensajes no-clasificados magn騁icamente) History_ResetSearch Reiniciar Password_Title Contrasea Password_Enter Escriba contrasea Password_Go 。Venga! Password_Error1 Contrasea incorrecta Security_Error1 El puerto seguro tiene que ser un nコ entre 1 y 65535 Security_Stealth Modo Oculto/Operacin del Servidor Security_NoStealthMode No (Modo Oculto) Security_ExplainStats Con esto activado POPFile envia una vez al da los tres valores siguientes a un script en getpopfile.org: bc (el nコ de categoras que tienes), mc (el nコ total de mensajes que ha clasificado POPFile) y ec (el nコ total de errores de clasificacin). Estos se guardan en un archivo que yo utilizar para publicar algunas estadsticas acerca de cmo usa la gente POPFile y cmo de bien les funciona. Mi servidor web mantiene sus archivos log unos 5 das y luego se borran; Yo no guardo ninguna relacin entre las estadsticas y sus direcciones IP individuales. Security_ExplainUpdate Con esto activado POPFile envia una vez al da los tres valores siguientes a un script en getpopfile.org: ma (el nコ de versin de tu POPFile), mi (el nコ de revisin de tu POPFile) y bn (el nコ de compilacin de tu POPFile). Si existe una nueva versin, POPFile recibe una respuesta en forma de gr畴ico que se muestra en la parte superior de la p疊ina. Mi servidor web mantiene sus archivos log unos 5 das y luego se borran; Yo no guardo ninguna relacin entre las comprobaciones de actualizacin y sus direcciones IP individuales. Security_PasswordTitle Contrasea del Interface de Usuario Security_Password Contrasea Security_PasswordUpdate Contrasea actualizada Security_AUTHTitle Autentificacin por Contrasea Segura/AUTH Security_SecureServer Servidor seguro Security_SecureServerUpdate Actualizado el servidor seguro a %s; este cambio ser efectivo en el siguiente reinicio de POPFile Security_SecurePort Puerto seguro Security_SecurePortUpdate Puerto actualizado a %s; este cambio ser efectivo en el siguiente reinicio de POPFile Security_SMTPServer servidor chain SMTP Security_SMTPServerUpdate Actualizado el servidor chain SMTP a %s; este cambio ser efectivo en el siguiente reinicio de POPFile Security_SMTPPort Puerto chain SMTP Security_SMTPPortUpdate Actualizado elpuerto chain SMTP a %s; este cambio ser efectivo en el siguiente reinicio de POPFile Security_POP3 Aceptar conexiones POP3 desde m痃uinas remotas (necesita reiniciar POPFile) Security_SMTP Aceptar conexiones SMTP desde m痃uinas remotas (necesita reiniciar POPFile) Security_NNTP Aceptar conexiones NNTP desde m痃uinas remotas (necesita reiniciar POPFile) Security_UI Aceptar conexiones HTTP (Interface del Usuario) desde m痃uinas remotas (necesita reiniciar POPFile) Security_XMLRPC Aceptar conexiones XML-RPC desde m痃uinas remotas (necesita reiniciar POPFile) Security_UpdateTitle Comprobacin autom疸ica de actualizacin Security_Update Buscar actualizaciones POPFile a diario Security_StatsTitle Enviar Estadsticas Security_Stats Enviar estadsticas diariamente Magnet_Error1 El im疣 '%s' ya exista en la categora '%s' Magnet_Error2 El nuevo im疣 '%s' interfiere con el im疣 '%s' de la categora '%s' y puede dar lugar a resultados ambiguos. No se ha aadido el nuevo. Magnet_Error3 Crear im疣 nuevo '%s' en la categora '%s' Magnet_CurrentMagnets Imanes Actuales Magnet_Message1 Los siguientes imanes hacen que el correo sea clasificado siempre en la categora especificada. Magnet_CreateNew Crear Im疣 Nuevo Magnet_Explanation Hay tres tipos de imanes disponibles:
  • Direccin de procedencia o nombre del remitente: Por ejemplo:
    felipe@company.com para capturar esta direccin especfica,
    company.com para capturar a cualquiera que enve desde company.com,
    Felipe Martinez para capturar esa persona especfica,
    Felipe para capturar a todos los Felipes
  • Direccin Para: o nombre del destinatario: Como un im疣 De: pero con la direccin Para: en un correo
  • Palabras en el Asunto: Por ejem.: hola para capturar todos los mensajes con hola en el asunto
Magnet_MagnetType Tipo de Im疣 Magnet_Value Valor Magnet_Always Ir siempre a categora Magnet_Jump Ir a la p疊ina iman Bucket_Error1 Los nombres de categora slo pueden contener las letras de la "a" a la "z" en minusculas, - y _ Bucket_Error2 Ya existe la categora %s Bucket_Error3 Categora %s creada Bucket_Error4 Ponga por favor una palabra no-vaca Bucket_Error5 Categora %s renombrada a %s Bucket_Error6 Categora %s borrada Bucket_Title Configuracion de la Categoria Bucket_BucketName Nombre de
Categora Bucket_WordCount Contador de Palabras Bucket_WordCounts Nコ de palabras Bucket_UniqueWords Palabras
nicas Bucket_SubjectModification Modificacin del
asunto Bucket_ChangeColor Cambiar
Color Bucket_NotEnoughData No hay bastantes datos Bucket_ClassificationAccuracy Exactitud de la Clasificacin Bucket_EmailsClassified correos clasificados Bucket_EmailsClassifiedUpper Correos Clasificados Bucket_ClassificationErrors Errores de clasificacin Bucket_Accuracy Exactitud Bucket_ClassificationCount Contador de Clasificacin Bucket_ClassificationFP Falsos Positivos Bucket_ClassificationFN Falsos Negativos Bucket_ResetStatistics Reiniciar Estadsticas Bucket_LastReset Ultimo Reinicio Bucket_CurrentColor El color actual de %s es %s Bucket_SetColorTo Cambiar el color de %s a %s Bucket_Maintenance Mantenimiento Bucket_CreateBucket Nombre de categora Bucket_DeleteBucket Borrar categora Bucket_RenameBucket Renombrar categora Bucket_Lookup Bsqueda Bucket_LookupMessage Buscar palabra en categoras Bucket_LookupMessage2 Buscar en resultados por Bucket_LookupMostLikely %s en su mayora aparece en %s Bucket_DoesNotAppear

%s no aparece en ninguna de las categoras Bucket_DisabledGlobally Desactivado globalmente Bucket_To a Bucket_Quarantine Mensaje en
Cuarentena SingleBucket_Title Detalle de %s SingleBucket_WordCount Categora nコ de palabras SingleBucket_TotalWordCount Nコ total de palabras SingleBucket_Percentage Porcentaje del total SingleBucket_WordTable Palabra Table for %s SingleBucket_Message1 Las palabras con estrellas (*) se han usado para clasificar en esta sesin de POPFile. Clic en cualquier palabra para buscar su probabilidad para todos las categoras. SingleBucket_Unique %s nico SingleBucket_ClearBucket Borrar Todas las Palabras Session_Title Terminada la Sesin POPFile Session_Error Ha expirado tu sesin en POPFile, y puede ser debido a arrancar y parar POPFile dejando tu navegador abierto. Por favor, pincha uno de los enlaces de arriba para seguir con POPFile. View_Title Vista de un solo mensaje View_ShowFrequencies Mostrar la frecuencia de las palabras View_ShowProbabilities Mostrar las probabilidades de las palabras View_ShowScores Mostrar las puntuaciones de las palabras View_WordMatrix Matriz de palabras View_WordProbabilities mostrando probabilidades de la palabra View_WordFrequencies mostrando frecuencia de la palabra View_WordScores mostrando puntuaciones de la palabra Windows_TrayIcon Mostrar el icono de POPFile en la bandeja del sistema? Windows_Console Hacer funcionar POPFile en una ventana de comandos? Windows_NextTime

Este cambio sera efectivo la proxima vez que arranques POPFile Header_MenuSummary Esta tabla es el men de navegacin que le permite acceder a cada una de las p疊inas del centro de control. History_MainTableSummary Esta tabla muestra el remitente y asunto de los mensajes recibidos recientemente y permite que sean revisados y reclasificados. Pinchando en la lnea de asunto se mostrar el texto completo del mensaje, junto con informacin acerca del porqu se clasific as. La columna 'Debera ser' le permite especificar a qu categora pertenece el mensaje, o deshacer el cambio. La columna 'Borrar' le permite borrar mensajes especficos del historial si usted ya no los necesita. History_OpenMessageSummary Esta tabla contiene el texto completo de un mensaje de correo, enfatizando las palabras que se han utilizado para clasificarlos acorde con la categora que era m疽 relevante para cada una. Bucket_MainTableSummary Esta tabla proporciona una visin global de las categoras de clasificacin. Cada fila muestra el nombre de la categora, el nコ total de palabras de esta categora, el nコ actual de palabras unicas en cada categora, si el asunto del correo se modificar al clasificarlo es esa categora, si pondr en cuarentena los mensajes recibidos en esa categora, y una tabla de la que escoger el color con el que se visualizar en el centro de control lo relacionado con esa categora. Bucket_StatisticsTableSummary Esta tabla proporciona tres conjuntos de estadsticas sobre el comportamiento global de POPFile. El 1コ es sobre lo acertada des su clasificacin, el 2コ es cu疣tos correos se han clasificado, y en qu categoras, y el 3コ es cu疣tas palabras hay en cada categora, y cu疝es son sus porcentajes relativos. Bucket_MaintenanceTableSummary Esta tabla confiene formularios que te permiten crear, borrar o renombrar categoras, y buscar palabras en todas las categoras para ver sus probabilidades relativas. Bucket_AccuracyChartSummary Esta tabla representa gr畴icamente la exactitud de la clasificacin de correo. Bucket_BarChartSummary Esta tabla representa gr畴icamente un distribucin percentual de cada una de las diferentes categoras. Esto se necesita para al nコ de correos clasificados, y el conteo total de palabras. Bucket_LookupResultsSummary Esta tabla muestra las probabilidades asociadas con una palabra dada en el corpus. Para cada categora, muestra la frecuencia con que se encuentra esa palabra, la probabilidad de que vuelava a encontrarse en esa categora, y el efecto en general sobre la puntuacin de la categora si esa palabra existe en un correo. Bucket_WordListTableSummary Esta tabla proporciona un listado de todas las palabras de una categora en particular, ordenadas por la primera letra comn de cada fila. Magnet_MainTableSummary Esta tabla muestra la lista de imanes que se han usado para autoclasificar el correo de acuerdo a reglas fijas. Cada fila muestra cmo est definido el im疣, para qu categora se ha ideado, y un botn para borrar el im疣. Configuration_MainTableSummary Esta tabla contiene los formularios que te permitir疣 controlar la configuracin de POPFile. Configuration_InsertionTableSummary Esta tabla contiene botones que determinan cuando se har疣 o no, ciertas modificaciones a la cabecera o al ttulo del correo antes de enviarlo al cliente de correo. Security_MainTableSummary Esta tabla proporciona grupos de controles que afectan a la seguridad de la configuracin global de POPFile, si tiene que comprobar autom疸icamente la existencia de actualizaciones del programa, y si las estadsticas sobre el comportamiento de POPFile tienen que enviarse al almac駭 de datos centralizado del autor del programa (para obtener informacin general). Advanced_MainTableSummary Esta tabla proporciona un listado de palabras que POPFile ignora cuando clasifica correos debido a su frecuencia relativa en todos ellos. Est疣 ordenadas por filas de acuerdo con la primera letra de las palabras. popfile-1.1.3+dfsg/languages/English.msg0000664000175000017500000007065111624177330017431 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode en LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # These are where to find the documents on the Wiki WikiLink index.php FAQLink FAQ RequestFeatureLink RequestFeature MailingListLink mailing_lists DonateLink Donate # Common words that are used on their own all over the interface Apply Apply ApplyChanges Apply Changes On On Off Off TurnOn Turn On TurnOff Turn Off Add Add Remove Remove Previous Previous Next Next From From Subject Subject Cc Cc Classification Bucket Reclassify Reclassify Probability Probability Scores Scores QuickMagnets QuickMagnets Undo Undo Close Close Find Find Filter Filter Yes Yes No No ChangeToYes Change to Yes ChangeToNo Change to No Bucket Bucket Magnet Magnet Delete Delete Create Create To To Total Total Rename Rename Frequency Frequency Probability Probability Score Score Lookup Lookup Word Word Count Count Update Update Refresh Refresh FAQ FAQ ID ID Date Date Arrived Arrived Size Size # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title POPFile Control Center Header_Shutdown Shutdown POPFile Header_History History Header_Buckets Buckets Header_Configuration Configuration Header_Advanced Advanced Header_Security Security Header_Magnets Magnets Footer_HomePage POPFile Home Page Footer_Manual Manual Footer_Forums Forums Footer_FeedMe Donate Footer_RequestFeature Request Feature Footer_MailingList Mailing List Footer_Wiki Documentation Configuration_Error1 The separator character must be a single character Configuration_Error2 The user interface port must be a number between 1 and 65535 Configuration_Error3 The POP3 listen port must be a number between 1 and 65535 Configuration_Error4 The page size must be a number between 1 and 1000 Configuration_Error5 The number of days in the history must be a number between 1 and 366 Configuration_Error6 The TCP timeout must be a number between 10 and 1800 Configuration_Error7 The XML RPC listen port must be a number between 1 and 65535 Configuration_Error8 The SOCKS V proxy port must be a number between 1 and 65535 Configuration_Error9 The user interface port cannot be the same value as the POP3 listen port Configuration_Error10 The POP3 listen port cannot be the same value as the user interface port Configuration_POP3Port POP3 listen port Configuration_POP3Update Updated POP3 port to %s; this change will not take affect until you restart POPFile Configuration_XMLRPCUpdate Updated XML-RPC port to %s; this change will not take affect until you restart POPFile Configuration_XMLRPCPort XML-RPC listen port Configuration_SMTPPort SMTP listen port Configuration_SMTPUpdate Updated SMTP port to %s; this change will not take affect until you restart POPFile Configuration_NNTPPort NNTP listen port Configuration_NNTPUpdate Updated NNTP port to %s; this change will not take affect until you restart POPFile Configuration_POPFork Allow concurrent POP3 connections Configuration_SMTPFork Allow concurrent SMTP connections Configuration_NNTPFork Allow concurrent NNTP connections Configuration_POP3Separator POP3 host:port:user separator character Configuration_NNTPSeparator NNTP host:port:user separator character Configuration_POP3SepUpdate Updated POP3 separator to %s Configuration_NNTPSepUpdate Updated NNTP separator to %s Configuration_UI User interface web port Configuration_UIUpdate Updated user interface web port to %s; this change will not take affect until you restart POPFile Configuration_History Number of messages per page Configuration_HistoryUpdate Updated number of messages per page to %s Configuration_Days Number of days of history to keep Configuration_DaysUpdate Updated number of days of history to %s Configuration_UserInterface User Interface Configuration_Skins Skins Configuration_SkinsChoose Choose skin Configuration_Language Language Configuration_LanguageChoose Choose language Configuration_ListenPorts Module Options Configuration_HistoryView History View Configuration_TCPTimeout Connection Timeout Configuration_TCPTimeoutSecs Connection timeout in seconds Configuration_TCPTimeoutUpdate Updated connection timeout to %s Configuration_ClassificationInsertion Message Text Insertion Configuration_SubjectLine Subject line
modification Configuration_XTCInsertion X-Text-Classification
Header Configuration_XPLInsertion X-POPFile-Link
Header Configuration_Logging Logging Configuration_None None Configuration_ToScreen To Screen (console) Configuration_ToFile To File Configuration_ToScreenFile To Screen and File Configuration_LoggerOutput Logger output Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Configuration_CurrentLogFile <View current log file> Configuration_SOCKSServer SOCKS V proxy host Configuration_SOCKSPort SOCKS V proxy port Configuration_SOCKSPortUpdate Updated SOCKS V proxy port to %s Configuration_SOCKSServerUpdate Updated SOCKS V proxy host to %s Configuration_Fields History Columns Advanced_Error1 '%s' already in the Ignored Words list Advanced_Error2 Ignored words can only contain alphanumeric, ., _, -, or @ characters Advanced_Error3 '%s' added to the Ignored Words list Advanced_Error4 '%s' is not in the Ignored Words list Advanced_Error5 '%s' removed from the Ignored Words list Advanced_StopWords Ignored Words Advanced_Message1 POPFile ignores the following frequently-used words: Advanced_AddWord Add word Advanced_RemoveWord Remove word Advanced_AllParameters All POPFile Parameters Advanced_Parameter Parameter Advanced_Value Value Advanced_Warning This is the complete list of POPFile parameters. Advanced users only: you may change any and click Update; there is no validity checking. Items shown in bold have been changed from the default setting. See OptionReference for more information on options. Advanced_ConfigFile Configuration file: History_Filter  (just showing bucket %s) History_FilterBy Filter By History_Search  (searched for from/subject %s) History_Title Recent Messages History_Jump Jump to page History_ShowAll Show All History_ShouldBe Should be History_NoFrom no from line History_NoSubject no subject line History_ClassifyAs Classify as History_MagnetUsed Magnet used History_MagnetBecause Magnet Used

Classified to %s because of magnet %s

History_ChangedTo Changed to %s History_Already Reclassified as %s History_RemoveAll Remove All History_RemovePage Remove Page History_RemoveChecked Remove Checked History_Remove To remove entries in the history click History_SearchMessage Search From/Subject History_NoMessages No messages History_NoMatchingMessages No matching messages History_ShowMagnet magnetized History_Negate_Search Invert search/filter History_Magnet  (just showing magnet classified messages) History_NoMagnet  (just showing non-magnet classified messages) History_ResetSearch Reset History_ChangedClass Would now classify as History_Purge Expire Now History_Increase Increase History_Decrease Decrease History_Column_Characters Change width of From, To, Cc and Subject columns History_Automatic Automatic History_Reclassified Reclassified History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Password Password_Enter Enter password Password_Go Go! Password_Error1 Incorrect password Security_Error1 The port must be a number between 1 and 65535 Security_Stealth Stealth Mode/Server Operation Security_NoStealthMode No (Stealth Mode) Security_StealthMode (Stealth Mode) Security_ExplainStats (With this turned on POPFile sends once per day the following three values to a script on getpopfile.org: bc (the total number of buckets that you have), mc (the total number of messages that POPFile has classified) and ec (the total number of classification errors). These three values get stored in a database which is used to generate some statistics about how people use POPFile and how well it works. Our web server keeps its log files for several days and then they get deleted; we are not storing any connection between the statistics and individual IP addresses.) Security_ExplainUpdate (With this turned on POPFile sends once per day the following three values to a script on getpopfile.org: ma (the major version number of your installed POPFile), mi (the minor version number of your installed POPFile) and bn (the build number of your installed POPFile). POPFile receives a response in the form of a graphic that appears at the top of the page if a new version is available. Our web server keeps its log files for several days and then they get deleted; we are not storing any connection between the update checks and individual IP addresses.) Security_PasswordTitle User Interface Password Security_Password Password Security_PasswordUpdate Updated password Security_AUTHTitle Remote Servers Security_SecureServer Remote POP3 server (SPA/AUTH or transparent proxy) Security_SecureServerUpdate Updated remote POP3 server to %s Security_SecurePort Remote POP3 port (SPA/AUTH or transparent proxy) Security_SecurePortUpdate Updated remote POP3 server port to %s Security_SMTPServer SMTP chain server Security_SMTPServerUpdate Updated SMTP chain server to %s; this change will not take affect until you restart POPFile Security_SMTPPort SMTP chain port Security_SMTPPortUpdate Updated SMTP chain port to %s; this change will not take affect until you restart POPFile Security_POP3 Accept POP3 connections from remote machines (requires POPFile restart) Security_SMTP Accept SMTP connections from remote machines (requires POPFile restart) Security_NNTP Accept NNTP connections from remote machines (requires POPFile restart) Security_UI Accept HTTP (User Interface) connections from remote machines (requires POPFile restart) Security_XMLRPC Accept XML-RPC connections from remote machines (requires POPFile restart) Security_UpdateTitle Automatic Update Checking Security_Update Check daily for updates to POPFile Security_StatsTitle Reporting Statistics Security_Stats Send statistics daily Magnet_Error1 Magnet '%s' already exists in bucket '%s' Magnet_Error2 New magnet '%s' clashes with magnet '%s' in bucket '%s' and could cause ambiguous results. New magnet was not added. Magnet_Error3 Create new magnet '%s' in bucket '%s' Magnet_CurrentMagnets Current Magnets Magnet_Message1 The following magnets cause mail to always be classified into the specified bucket. Magnet_CreateNew Create New Magnet Magnet_Explanation These types of magnets are available:
  • From address or name: For example: john@company.com to match a specific address,
    company.com to match everyone who sends from company.com,
    John Doe to match a specific person, John to match all Johns
  • To/Cc address or name: Like a From: magnet but for the To:/Cc: address in a message
  • Subject words: For example: hello to match all messages with hello in the subject
Magnet_MagnetType Magnet type Magnet_Value Values Magnet_Always Always goes to bucket Magnet_Jump Jump to magnet page Bucket_Error1 Bucket names can only contain the letters a to z in lower case, numbers 0 to 9, plus - and _ Bucket_Error2 Bucket named %s already exists Bucket_Error3 Created bucket named %s Bucket_Error4 Please enter a non-blank word Bucket_Error5 Renamed bucket %s to %s Bucket_Error6 Deleted bucket %s Bucket_Title Bucket Configuration Bucket_BucketName Bucket
Name Bucket_WordCount Word Count Bucket_WordCounts Word Counts Bucket_UniqueWords Distinct
Words Bucket_SubjectModification Subject Header
Modification Bucket_ChangeColor Bucket
Color Bucket_NotEnoughData Not enough data Bucket_ClassificationAccuracy Classification Accuracy Bucket_EmailsClassified Messages classified Bucket_EmailsClassifiedUpper Messages Classified Bucket_ClassificationErrors Classification errors Bucket_Accuracy Accuracy Bucket_ClassificationCount Classification Count Bucket_ClassificationFP False Positives Bucket_ClassificationFN False Negatives Bucket_ResetStatistics Reset Statistics Bucket_LastReset Last Reset Bucket_CurrentColor %s current color is %s Bucket_SetColorTo Set %s color to %s Bucket_Maintenance Maintenance Bucket_CreateBucket Create bucket with name Bucket_DeleteBucket Delete bucket named Bucket_RenameBucket Rename bucket named Bucket_Lookup Lookup Bucket_LookupMessage Lookup word in buckets Bucket_LookupMessage2 Lookup result for Bucket_LookupMostLikely %s is most likely to appear in %s Bucket_DoesNotAppear

%s does not appear in any of the buckets Bucket_InIgnoredWords %s is in Ignored Words. POPFile ignores this word Bucket_DisabledGlobally Disabled globally Bucket_To to Bucket_Quarantine Quarantine
Message SingleBucket_Title Detail for %s SingleBucket_WordCount Bucket word count SingleBucket_TotalWordCount Total word count SingleBucket_Percentage Percentage of total SingleBucket_WordTable Word Table for %s SingleBucket_Message1 Click a letter in the index to see the list of words that start with that letter. Click any word to lookup its probability for all buckets. SingleBucket_Unique %s distinct SingleBucket_ClearBucket Remove All Words Session_Title POPFile Session Expired Session_Error Your POPFile session has expired. This could have been caused by starting and stopping POPFile but leaving your web browser open. Please click one of the links above to continue using POPFile. View_Title Single Message View View_ShowFrequencies Show word frequencies View_ShowProbabilities Show word probabilities View_ShowScores Show word scores and decision chart View_WordMatrix Word matrix View_WordProbabilities showing word probabilities View_WordFrequencies showing word frequencies View_WordScores showing word scores View_Chart Decision Chart View_DownloadMessage Download Message View_MessageHeader Message Header View_MessageBody Message Body Windows_TrayIcon Show POPFile icon in Windows system tray? Windows_Console Run POPFile in a console window? Windows_NextTime

This change will not take effect until the next time you start POPFile Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of a message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the message's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many messages have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the message classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of messages classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency with which that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify messages according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the message before it is passed on to the message client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying messages due to their relative frequency in messages in general. They are organized per row according to the first letter of the words. Imap_Bucket2Folder Mail for bucket '%s' goes to folder Imap_MapError You cannot map more than one bucket to a single folder! Imap_Server IMAP server hostname: Imap_ServerNameError Please enter the server's hostname! Imap_Port IMAP Server port: Imap_PortError Please enter a valid port number! Imap_Login IMAP account login: Imap_LoginError Please enter a user/login name! Imap_Password Password for IMAP account: Imap_PasswordError Please enter a password for the server! Imap_Expunge Expunge deleted messages from watched folders. Imap_Interval Update interval in seconds: Imap_IntervalError Please enter an interval between 10 and 3600 seconds. Imap_Bytelimit Bytes per message to use for classification. Enter 0 (Null) for the complete message: Imap_BytelimitError Please enter a number. Imap_RefreshFolders Refresh list of folders Imap_Now now! Imap_UpdateError1 Could not login. Verify your login name and password, please. Imap_UpdateError2 Failed to connect to server. Please check the host name and port and make sure you are online. Imap_UpdateError3 Please configure the connection details first. Imap_NoConnectionMessage Please configure the connection details first. After you have done that, more options will be available on this page. Imap_WatchMore a folder to list of watched folders Imap_WatchedFolder Watched folder no Imap_Use_SSL Use SSL Shutdown_Message POPFile has shut down Help_Training When you first use POPFile, it knows nothing and will need some training. POPFile requires training on messages for each bucket, training occurs when you reclassify a message POPFile missclassified to the correct bucket. Before POPFile will classify the first message, you will have to have reclassified messages to at least two buckets. You must also setup your mail client to filter messages based on POPFile's classification. Information on setting up your client filtering can be found at the POPFile Documentation Project. Help_Bucket_Setup POPFile requires at least two buckets in addition to the "unclassified" pseudo-bucket. What makes POPFile unique is that it can classify email more than that, you can have any number of buckets. A simple setup would be a "spam", "personal", and a "work" bucket. Help_No_More Don't show this again popfile-1.1.3+dfsg/languages/English-UK.msg0000664000175000017500000007056511624177330017752 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode en LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # These are where to find the documents on the Wiki WikiLink index.php FAQLink FAQ RequestFeatureLink RequestFeature MailingListLink mailing_lists DonateLink Donate # Common words that are used on their own all over the interface Apply Apply ApplyChanges Apply Changes On On Off Off TurnOn Turn On TurnOff Turn Off Add Add Remove Remove Previous Previous Next Next From From Subject Subject Cc Cc Classification Bucket Reclassify Reclassify Probability Probability Scores Scores QuickMagnets QuickMagnets Undo Undo Close Close Find Find Filter Filter Yes Yes No No ChangeToYes Change to Yes ChangeToNo Change to No Bucket Bucket Magnet Magnet Delete Delete Create Create To To Total Total Rename Rename Frequency Frequency Probability Probability Score Score Lookup Lookup Word Word Count Count Update Update Refresh Refresh FAQ FAQ ID ID Date Date Arrived Arrived Size Size # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %d %b %Y %R # The header and footer that appear on every UI page Header_Title POPFile Control Centre Header_Shutdown Shutdown POPFile Header_History History Header_Buckets Buckets Header_Configuration Configuration Header_Advanced Advanced Header_Security Security Header_Magnets Magnets Footer_HomePage POPFile Home Page Footer_Manual Manual Footer_Forums Forums Footer_FeedMe Donate Footer_RequestFeature Request Feature Footer_MailingList Mailing List Footer_Wiki Documentation Configuration_Error1 The separator character must be a single character Configuration_Error2 The user interface port must be a number between 1 and 65535 Configuration_Error3 The POP3 listen port must be a number between 1 and 65535 Configuration_Error4 The page size must be a number between 1 and 1000 Configuration_Error5 The number of days in the history must be a number between 1 and 366 Configuration_Error6 The TCP timeout must be a number between 10 and 1800 Configuration_Error7 The XML RPC listen port must be a number between 1 and 65535 Configuration_Error8 The SOCKS V proxy port must be a number between 1 and 65535 Configuration_Error9 The user interface port cannot be the same value as the POP3 listen port Configuration_Error10 The POP3 listen port cannot be the same value as the user interface port Configuration_POP3Port POP3 listen port Configuration_POP3Update Updated POP3 port to %s; this change will not take affect until you restart POPFile Configuration_XMLRPCUpdate Updated XML-RPC port to %s; this change will not take affect until you restart POPFile Configuration_XMLRPCPort XML-RPC listen port Configuration_SMTPPort SMTP listen port Configuration_SMTPUpdate Updated SMTP port to %s; this change will not take affect until you restart POPFile Configuration_NNTPPort NNTP listen port Configuration_NNTPUpdate Updated NNTP port to %s; this change will not take affect until you restart POPFile Configuration_POPFork Allow concurrent POP3 connections Configuration_SMTPFork Allow concurrent SMTP connections Configuration_NNTPFork Allow concurrent NNTP connections Configuration_POP3Separator POP3 host:port:user separator character Configuration_NNTPSeparator NNTP host:port:user separator character Configuration_POP3SepUpdate Updated POP3 separator to %s Configuration_NNTPSepUpdate Updated NNTP separator to %s Configuration_UI User interface web port Configuration_UIUpdate Updated user interface web port to %s; this change will not take affect until you restart POPFile Configuration_History Number of messages per page Configuration_HistoryUpdate Updated number of messages per page to %s Configuration_Days Number of days of history to keep Configuration_DaysUpdate Updated number of days of history to %s Configuration_UserInterface User Interface Configuration_Skins Skins Configuration_SkinsChoose Choose skin Configuration_Language Language Configuration_LanguageChoose Choose language Configuration_ListenPorts Module Options Configuration_HistoryView History View Configuration_TCPTimeout Connection Timeout Configuration_TCPTimeoutSecs Connection timeout in seconds Configuration_TCPTimeoutUpdate Updated connection timeout to %s Configuration_ClassificationInsertion Message Text Insertion Configuration_SubjectLine Subject line
modification Configuration_XTCInsertion X-Text-Classification
Header Configuration_XPLInsertion X-POPFile-Link
Header Configuration_Logging Logging Configuration_None None Configuration_ToScreen To Screen (console) Configuration_ToFile To File Configuration_ToScreenFile To Screen and File Configuration_LoggerOutput Logger output Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Configuration_CurrentLogFile <View current log file> Configuration_SOCKSServer SOCKS V proxy host Configuration_SOCKSPort SOCKS V proxy port Configuration_SOCKSPortUpdate Updated SOCKS V proxy port to %s Configuration_SOCKSServerUpdate Updated SOCKS V proxy host to %s Configuration_Fields History Columns Advanced_Error1 '%s' already in the Ignored Words list Advanced_Error2 Ignored words can only contain alphanumeric, ., _, -, or @ characters Advanced_Error3 '%s' added to the Ignored Words list Advanced_Error4 '%s' is not in the Ignored Words list Advanced_Error5 '%s' removed from the Ignored Words list Advanced_StopWords Ignored Words Advanced_Message1 POPFile ignores the following frequently-used words: Advanced_AddWord Add word Advanced_RemoveWord Remove word Advanced_AllParameters All POPFile Parameters Advanced_Parameter Parameter Advanced_Value Value Advanced_Warning This is the complete list of POPFile parameters. Advanced users only: you may change any and click Update; there is no validity checking. Items shown in bold have been changed from the default setting. See OptionReference for more information on options. Advanced_ConfigFile Configuration file: History_Filter  (just showing bucket %s) History_FilterBy Filter By History_Search  (searched for from/subject %s) History_Title Recent Messages History_Jump Jump to page History_ShowAll Show All History_ShouldBe Should be History_NoFrom no from line History_NoSubject no subject line History_ClassifyAs Classify as History_MagnetUsed Magnet used History_MagnetBecause Magnet Used

Classified to %s because of magnet %s

History_ChangedTo Changed to %s History_Already Reclassified as %s History_RemoveAll Remove All History_RemovePage Remove Page History_RemoveChecked Remove Checked History_Remove To remove entries in the history click History_SearchMessage Search From/Subject History_NoMessages No messages History_ShowMagnet magnetised History_Negate_Search Invert search/filter History_Magnet  (just showing magnet classified messages) History_NoMagnet  (just showing non-magnet classified messages) History_ResetSearch Reset History_ChangedClass Would now classify as History_Purge Expire Now History_Increase Increase History_Decrease Decrease History_Column_Characters Change width of From, To, Cc and Subject columns History_Automatic Automatic History_Reclassified Reclassified History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Password Password_Enter Enter password Password_Go Go! Password_Error1 Incorrect password Security_Error1 The port must be a number between 1 and 65535 Security_Stealth Stealth Mode/Server Operation Security_NoStealthMode No (Stealth Mode) Security_StealthMode (Stealth Mode) Security_ExplainStats (With this turned on POPFile sends once per day the following three values to a script on getpopfile.org: bc (the total number of buckets that you have), mc (the total number of messages that POPFile has classified) and ec (the total number of classification errors). These three values get stored in a database which is used to generate some statistics about how people use POPFile and how well it works. Our web server keeps its log files for several days and then they get deleted; we are not storing any connection between the statistics and individual IP addresses.) Security_ExplainUpdate (With this turned on POPFile sends once per day the following three values to a script on getpopfile.org: ma (the major version number of your installed POPFile), mi (the minor version number of your installed POPFile) and bn (the build number of your installed POPFile). POPFile receives a response in the form of a graphic that appears at the top of the page if a new version is available. Our web server keeps its log files for several days and then they get deleted; we are not storing any connection between the update checks and individual IP addresses.) Security_PasswordTitle User Interface Password Security_Password Password Security_PasswordUpdate Updated password Security_AUTHTitle Remote Servers Security_SecureServer Remote POP3 server (SPA/AUTH or transparent proxy) Security_SecureServerUpdate Updated remote POP3 server to %s Security_SecurePort Remote POP3 port (SPA/AUTH or transparent proxy) Security_SecurePortUpdate Updated remote POP3 server port to %s Security_SMTPServer SMTP chain server Security_SMTPServerUpdate Updated SMTP chain server to %s; this change will not take affect until you restart POPFile Security_SMTPPort SMTP chain port Security_SMTPPortUpdate Updated SMTP chain port to %s; this change will not take affect until you restart POPFile Security_POP3 Accept POP3 connections from remote machines (requires POPFile restart) Security_SMTP Accept SMTP connections from remote machines (requires POPFile restart) Security_NNTP Accept NNTP connections from remote machines (requires POPFile restart) Security_UI Accept HTTP (User Interface) connections from remote machines (requires POPFile restart) Security_XMLRPC Accept XML-RPC connections from remote machines (requires POPFile restart) Security_UpdateTitle Automatic Update Checking Security_Update Check daily for updates to POPFile Security_StatsTitle Reporting Statistics Security_Stats Send statistics daily Magnet_Error1 Magnet '%s' already exists in bucket '%s' Magnet_Error2 New magnet '%s' clashes with magnet '%s' in bucket '%s' and could cause ambiguous results. New magnet was not added. Magnet_Error3 Create new magnet '%s' in bucket '%s' Magnet_CurrentMagnets Current Magnets Magnet_Message1 The following magnets cause mail to always be classified into the specified bucket. Magnet_CreateNew Create New Magnet Magnet_Explanation These types of magnets are available:
  • From address or name: For example: john@company.com to match a specific address,
    company.com to match everyone who sends from company.com,
    John Doe to match a specific person, John to match all Johns
  • To/Cc address or name: Like a From: magnet but for the To:/Cc: address in a message
  • Subject words: For example: hello to match all messages with hello in the subject
Magnet_MagnetType Magnet type Magnet_Value Values Magnet_Always Always goes to bucket Magnet_Jump Jump to magnet page Bucket_Error1 Bucket names can only contain the letters a to z in lower case, numbers 0 to 9, plus - and _ Bucket_Error2 Bucket named %s already exists Bucket_Error3 Created bucket named %s Bucket_Error4 Please enter a non-blank word Bucket_Error5 Renamed bucket %s to %s Bucket_Error6 Deleted bucket %s Bucket_Title Bucket Configuration Bucket_BucketName Bucket
Name Bucket_WordCount Word Count Bucket_WordCounts Word Counts Bucket_UniqueWords Distinct
Words Bucket_SubjectModification Subject Header
Modification Bucket_ChangeColor Bucket
Colour Bucket_NotEnoughData Not enough data Bucket_ClassificationAccuracy Classification Accuracy Bucket_EmailsClassified Messages classified Bucket_EmailsClassifiedUpper Messages Classified Bucket_ClassificationErrors Classification errors Bucket_Accuracy Accuracy Bucket_ClassificationCount Classification Count Bucket_ClassificationFP False Positives Bucket_ClassificationFN False Negatives Bucket_ResetStatistics Reset Statistics Bucket_LastReset Last Reset Bucket_CurrentColor %s current colour is %s Bucket_SetColorTo Set %s colour to %s Bucket_Maintenance Maintenance Bucket_CreateBucket Create bucket with name Bucket_DeleteBucket Delete bucket named Bucket_RenameBucket Rename bucket named Bucket_Lookup Lookup Bucket_LookupMessage Lookup word in buckets Bucket_LookupMessage2 Lookup result for Bucket_LookupMostLikely %s is most likely to appear in %s Bucket_DoesNotAppear

%s does not appear in any of the buckets Bucket_InIgnoredWords %s is in Ignored Words. POPFile ignores this word Bucket_DisabledGlobally Disabled globally Bucket_To to Bucket_Quarantine Quarantine
Message SingleBucket_Title Detail for %s SingleBucket_WordCount Bucket word count SingleBucket_TotalWordCount Total word count SingleBucket_Percentage Percentage of total SingleBucket_WordTable Word Table for %s SingleBucket_Message1 Click a letter in the index to see the list of words that start with that letter. Click any word to lookup its probability for all buckets. SingleBucket_Unique %s distinct SingleBucket_ClearBucket Remove All Words Session_Title POPFile Session Expired Session_Error Your POPFile session has expired. This could have been caused by starting and stopping POPFile but leaving your web browser open. Please click one of the links above to continue using POPFile. View_Title Single Message View View_ShowFrequencies Show word frequencies View_ShowProbabilities Show word probabilities View_ShowScores Show word scores and decision chart View_WordMatrix Word matrix View_WordProbabilities showing word probabilities View_WordFrequencies showing word frequencies View_WordScores showing word scores View_Chart Decision Chart View_DownloadMessage Download Message View_MessageHeader Message Header View_MessageBody Message Body Windows_TrayIcon Show POPFile icon in Windows system tray? Windows_Console Run POPFile in a console window? Windows_NextTime

This change will not take effect until the next time you start POPFile Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control centre. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of a message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the message's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the colour used in displaying anything related to that bucket in the control centre. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many messages have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the message classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of messages classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency with which that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organised by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify messages according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the message before it is passed on to the message client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying messages due to their relative frequency in messages in general. They are organized per row according to the first letter of the words. Imap_Bucket2Folder Mail for bucket '%s' goes to folder Imap_MapError You cannot map more than one bucket to a single folder! Imap_Server IMAP server hostname: Imap_ServerNameError Please enter the server's hostname! Imap_Port IMAP Server port: Imap_PortError Please enter a valid port number! Imap_Login IMAP account login: Imap_LoginError Please enter a user/login name! Imap_Password Password for IMAP account: Imap_PasswordError Please enter a password for the server! Imap_Expunge Expunge deleted messages from watched folders. Imap_Interval Update interval in seconds: Imap_IntervalError Please enter an interval between 10 and 3600 seconds. Imap_Bytelimit Bytes per message to use for classification. Enter 0 (Null) for the complete message: Imap_BytelimitError Please enter a number. Imap_RefreshFolders Refresh list of folders Imap_Now now! Imap_UpdateError1 Could not login. Verify your login name and password, please. Imap_UpdateError2 Failed to connect to server. Please check the host name and port and make sure you are online. Imap_UpdateError3 Please configure the connection details first. Imap_NoConnectionMessage Please configure the connection details first. After you have done that, more options will be available on this page. Imap_WatchMore a folder to list of watched folders Imap_WatchedFolder Watched folder no Imap_Use_SSL Use SSL Shutdown_Message POPFile has shut down Help_Training When you first use POPFile, it knows nothing and will need some training. POPFile requires training on messages for each bucket, training occurs when you reclassify a message POPFile misclassified to the correct bucket. Before POPFile will classify the first message, you will have to have reclassified messages to at least two buckets. You must also setup your mail client to filter messages based on POPFile's classification. Information on setting up your client filtering can be found at the POPFile Documentation Project. Help_Bucket_Setup POPFile requires at least two buckets in addition to the "unclassified" pseudo-bucket. What makes POPFile unique is that it can classify email more than that, you can have any number of buckets. A simple setup would be a "spam", "personal", and a "work" bucket. Help_No_More Don't show this again popfile-1.1.3+dfsg/languages/Deutsch.msg0000664000175000017500000007204311624177330017434 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode de # This is used to get the appropriate subdirectory for the manual ManualLanguage de # Common words that are used on their own all over the interface Apply Anwenden ApplyChanges トnderungen bernehmen On Ein Off Aus TurnOn Einschalten TurnOff Ausschalten Add Hinzufgen Remove Entfernen Previous Zurck Next Weiter From Absender Subject Betreff Cc Cc Classification Einstufung Reclassify Neu einstufen Probability Wahrscheinlichkeit Scores Auswertung QuickMagnets Sofort-Magnete Undo widerrufen Close Schlie゚en Find Suchen Filter Filtern Yes Ja No Nein ChangeToYes トndern in Ja ChangeToNo トndern in Nein Bucket Kategorie Magnet Magnet Delete Lschen Create Erstellen To Empf舅ger Total Insgesamt Rename Umbenennen Frequency H舫figkeit Probability Wahrscheinlichkeit Score Bewertung Lookup Nachschlagen Word Wort Count Anzahl Update トndern Refresh Aktualisieren FAQ FAQ ID ID Date Datum Arrived Eingang Size Gr゚e # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands . Locale_Decimal , # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %d.%m.%y %R # The header and footer that appear on every UI page Header_Title POPFile Kontrollzentrum Header_Shutdown Herunterfahren Header_History Verlauf Header_Buckets Kategorien Header_Configuration Konfiguration Header_Advanced Erweitert Header_Security Sicherheit Header_Magnets Magnete Footer_HomePage POPFile Homepage Footer_Manual Handbuch Footer_Forums Foren Footer_FeedMe Spenden Footer_RequestFeature Verbesserung vorschlagen Footer_MailingList Mailing Liste Footer_Wiki Zus舩zliche Dokumentation Configuration_Error1 Das Trennzeichen mu゚ ein einzelnes Zeichen sein. Configuration_Error2 Der Port fr das Kontrollzentrum mu゚ zwischen 1 und 65535 liegen. Configuration_Error3 Der POP3 Port mu゚ zwischen 1 und 65535 liegen. Configuration_Error4 Die Seitengr゚e mu゚ zwischen 1 und 1000 liegen. Configuration_Error5 Die Anzahl der Tage im Verlauf mu゚ zwischen 1 und 366 liegen. Configuration_Error6 Der TCP Timeout mu゚ zwischen 10 und 1800 liegen. Configuration_Error7 Der XML-RPC Port mu゚ zwischen 1 und 65535 liegen. Configuration_Error8 Der SOCKS V Proxy Port mu゚ zwischen 1 und 65535 liegen. Configuration_Error9 Der HTML-Port darf nicht den gleichen Wert haben wie der POP3-Port. Configuration_Error10 Der POP3-Port darf nicht den gleichen Wert haben wie der HTML-Port. Configuration_POP3Port POP3 Port Configuration_POP3Update Neuer POP3 Port: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Configuration_XMLRPCUpdate Neuer XML-RPC Port: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Configuration_XMLRPCPort XML-RPC Port Configuration_SMTPPort SMTP Port Configuration_SMTPUpdate Neuer SMTP Port: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Configuration_NNTPPort NNTP Port Configuration_NNTPUpdate Neuer NNTP Port: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Configuration_POPFork Simultane POP3-Verbindungen erlauben Configuration_SMTPFork Simultane SMTP-Verbindungen erlauben Configuration_NNTPFork Simultane NNTP-Verbindungen erlauben Configuration_POP3Separator POP3 Server:Port:Benutzer Trennzeichen Configuration_NNTPSeparator NNTP Server:Port:Benutzer Trennzeichen Configuration_POP3SepUpdate Neues POP3 Trennzeichen: %s Configuration_NNTPSepUpdate Neues NNTP Trennzeichen: %s Configuration_UI Web Port fr Kontrollzentrum Configuration_UIUpdate Neuer Web Port fr Kontrollzentrum: %s - Dieser トnderung wird erst nach einem Neustart von POPFile wirksam. Configuration_History Anzahl Nachrichten pro Seite Configuration_HistoryUpdate Neue Anzahl Nachrichten pro Seite: %s Configuration_Days Nachrichten x Tage im Verlauf speichern Configuration_DaysUpdate Nachrichten werden nun %s Tage im Verlauf gespeichert Configuration_UserInterface Benutzeroberfl臘he Configuration_Skins Skins Configuration_SkinsChoose Skin ausw臧len Configuration_Language Sprache Configuration_LanguageChoose Sprache ausw臧len Configuration_ListenPorts Moduleinstellungen Configuration_HistoryView Verlaufsansicht Configuration_TCPTimeout Verbindungstimeout Configuration_TCPTimeoutSecs Verbindungstimeout in Sekunden Configuration_TCPTimeoutUpdate Neuer Verbidungstimeout: %s Configuration_ClassificationInsertion Einstufung anzeigen Configuration_SubjectLine Betreff-Zeile 舅dern Configuration_XTCInsertion X-Text-Classification einfgen Configuration_XPLInsertion X-POPFile-Link einfgen Configuration_Logging Protokollierung Configuration_None Keine Ausgabe Configuration_ToScreen Auf den Bildschirm Configuration_ToFile In eine Datei Configuration_ToScreenFile Bildschirm und Datei Configuration_LoggerOutput Protokoll ausgeben Configuration_GeneralSkins Skins Configuration_SmallSkins kleine Skins Configuration_TinySkins sehr kleine Skins Configuration_CurrentLogFile <aktuelle Protokolldatei> Configuration_SOCKSServer SOCKS V Proxy Host Configuration_SOCKSPort SOCKS V Proxy Port Configuration_SOCKSPortUpdate SOCKS V Proxy Port ge舅dert auf %s Configuration_SOCKSServerUpdate SOCKS V Proxy Host ge舅dert auf %s Configuration_Fields Spalten im Verlauf Advanced_Error1 '%s' ist bereits in der Liste der ignorierten Wrter Advanced_Error2 Ignorierte Wrtern knnen nur alphanumerische, ., _, -, oder @ Zeichen enthalten Advanced_Error3 '%s' zu den ignorierten Wrtern hinzugefgt Advanced_Error4 '%s' ist nicht in der Liste der ignorierten Wrter Advanced_Error5 '%s' von der Liste der ignorierten Wrter entfernt Advanced_StopWords Ignorierte Wrter Advanced_Message1 POPFile ignoriert die folgenden, h舫fig verwendeten Wrter: Advanced_AddWord Wort hinzufgen Advanced_RemoveWord Wort lschen Advanced_AllParameters POPFile Konfigurationsparameter Advanced_Parameter Parameter Advanced_Value Wert Advanced_Warning Dies ist eine komplette Liste aller Parameter Ihrer POPFile Konfiguration. Nur fr fortgeschrittene Anwender: Sie knnen jeden Wert 舅dern und durch einen Klick auf "トndern" best舩igen. Eingaben werden nicht auf Gltigkeit berprft! Advanced_ConfigFile Konfigurationsdatei: History_Filter  (zeige nur Kategorie %s) History_FilterBy Filtern nach History_Search  (gesuchter Absender/Betreff: %s) History_Title Aktuelle Nachrichten History_Jump zu Seite gehen History_ShowAll Alle anzeigen History_ShouldBe Sollte sein History_NoFrom kein Absender angegeben History_NoSubject kein Betreff History_ClassifyAs eingestuft als History_MagnetUsed Magnet benutzt History_MagnetBecause Magnet benutzt

Eingestuft als %s durch Magnet %s

History_ChangedTo Ge舅dert: %s History_Already Neu eingestuft als %s History_RemoveAll Alle entfernen History_RemovePage Diese Seite entfernen History_RemoveChecked Ausgew臧lte Eintr臠e lschen History_Remove Um Eintr臠e im Verlauf zu lschen, klicken Sie auf History_SearchMessage Nach Absender/Betreff suchen History_NoMessages keine Nachrichten History_ShowMagnet magnetisiert History_Negate_Search Filter invertieren History_Magnet  (zeige nur durch Magnet eingestufte Nachrichten) History_NoMagnet  (zeige nicht durch Magnet eingestufte Nachrichten) History_ResetSearch Zurcksetzen History_ChangedClass Wrde jetzt eingestuft als History_Purge Jetzt lschen History_Increase gr゚er History_Decrease kleiner History_Column_Characters Gr゚e der Spalten fr From, To, Cc und Subject History_Automatic automatisch History_Reclassified Neu eingestuft History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Pa゚wort Password_Enter Pa゚wort eingeben Password_Go Anmelden Password_Error1 Falsches Pa゚wort Security_Error1 Der Port mu゚ zwischen 1 und 65535 liegen. Security_Stealth Stealth Modus/Serverbetrieb Security_NoStealthMode Nein (Stealth Modus) Security_StealthMode (Stealth Modus) Security_ExplainStats (Wenn Sie diese Funktion einschalten, sendet POPFile t臠lich die drei folgenden Werte an ein Skript auf getpopfile.org: bc (Anzahl von Ihnen eingerichteter Kategorien), mc (Anzahl von POPFile eingestufter Nachrichten) und ec (Anzahl der Einstufungsfehler). Diese werden in einer Datei gespeichert und benutzt, um ffentliche Statistiken darber zu erstellen, wie POPFile genutzt wird und wie gut es dabei funktioniert. Die Daten werden etwa 5 Tage auf dem Server gespeichert und dann gelscht. Zuordnungen zwischen IP-Adressen und statistischen Daten werden nicht gespeichert.) Security_ExplainUpdate (Wenn Sie diese Funktion einschalten, sendet POPFile t臠lich die drei folgenden Werte an ein Skript auf getpopfile.org: ma (die Hauptversionsnummer der POPFile-Installation), mi (die Nebenversionsnummer der POPFile-Installation) und bn (die build-Nummer der POPFile-Installation). POPFile erh舁t die Antwort in Form einer Grafik, die am Kopf einer Seite erscheint, wenn eine neue Version verfgbar ist. Die Daten werden etwa 5 Tage auf dem Server gespeichert und dann gelscht. Zuordnungen zwischen IP-Adressen und statistischen Daten werden nicht gespeichert.) Security_PasswordTitle Pa゚wort fr Benutzeroberfl臘he Security_Password Pa゚wort Security_PasswordUpdate Passwort ge舅dert Security_AUTHTitle externe Server Security_SecureServer POP3 Server (SPA/AUTH oder transparenter Proxy) Security_SecureServerUpdate Neuer externer POP3 Server: %s Security_SecurePort POP3 Port (SPA/AUTH oder transparenter Proxy) Security_SecurePortUpdate Neuer POP3 Port %s Security_SMTPServer externer SMTP Server Security_SMTPServerUpdate Neuer externer SMTP Server: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Security_SMTPPort externer SMTP port Security_SMTPPortUpdate Neuer externer SMTP Port: %s - Diese トnderung wird erst nach einem Neustart von POPFile wirksam. Security_POP3 POP3 Verbindungen von fremden Rechnern erlauben (erfordert Neustart von POPFile) Security_SMTP SMTP Verbindungen von fremden Rechnern erlauben (erfordert Neustart von POPFILE) Security_NNTP NNTP Verbindungen von fremden Rechnern erlauben (erfordert Neustart von POPFile) Security_UI HTTP (Benutzeroberfl臘he) Verbindungen von fremden Rechnern erlauben (erfordert Neustart von POPFile) Security_XMLRPC XML-RPC Verbindungen von fremden Rechnern erlauben (erfordert Neustart von POPFile) Security_UpdateTitle Automatisch auf Updates prfen Security_Update T臠lich nach POPFile Updates suchen Security_StatsTitle Statistik Report Security_Stats T臠lich Statistiken senden Magnet_Error1 Magnet '%s' existiert bereits in Kategorie '%s' Magnet_Error2 Neuer Magnet '%s' kollidiert mit Magnet '%s' in Kategorie '%s' und knnte unklare Ergebnisse verursachen. Magnet wurde nicht unzugefgt. Magnet_Error3 Erstelle neuen Magnet '%s' in Kategorie '%s' Magnet_CurrentMagnets Aktuelle Magnete Magnet_Message1 Die folgenden Magnete ordnen neue Post zwingend in eine angegebene Kategorie ein. Magnet_CreateNew Neuen Magnet erstellen Magnet_Explanation Diese Arten von Magneten sind verfgbar:
  • Absenderadresse oder -name: z.B.: hans@firma.de, um eine bestimmte Adresse zu erfassen,
    firma.de, um jeden zu erfassen, der von firma.de sendet,
    Hans Mustermann, um eine bestimmte Person zu erfassen; Hans erfa゚t jeden Hans
  • Empf舅ger/CC-Adresse oder -Name: Wie beim Absender-Magnet nur fr die Empf舅ger/CC-Adresse der Nachricht.
  • Wrter im Betreff: z.B.: "Hallo", um alle Nachrichten mit "Hallo" im Betreff zu erfassen
Magnet_MagnetType Typ des Magnets Magnet_Value Wert Magnet_Always Immer dieser Kategorie zuordnen Magnet_Jump Gehe zu Magnet Seite Bucket_Error1 Kategorienamen knnen nur Kleinbuchstaben von a bis z, Ziffern von 0 bis 9, - oder _ enthalten Bucket_Error2 Kategoriename %s existiert bereits Bucket_Error3 Kategorie %s erstellt Bucket_Error4 Bitte geben Sie ein nicht-leeres Wort ein Bucket_Error5 Kategorie %s in %s umbenannt Bucket_Error6 Kategorie %s gelscht Bucket_Title Kategorien konfigurieren Bucket_BucketName Name der Kategorie Bucket_WordCount Wortanzahl Bucket_WordCounts Wortanzahl Bucket_UniqueWords verschiedene Wrter Bucket_SubjectModification Betreffzeile 舅dern Bucket_ChangeColor Farbe 舅dern Bucket_NotEnoughData Nicht gengend Daten Bucket_ClassificationAccuracy Genauigkeit Bucket_EmailsClassified Nachrichten klassifiziert Bucket_EmailsClassifiedUpper Nachrichten klassifiziert Bucket_ClassificationErrors Einstufungsfehler Bucket_Accuracy Genauigkeit Bucket_ClassificationCount Anzahl Einstufungen Bucket_ClassificationFP falsch positiv Bucket_ClassificationFN falsch negativ Bucket_ResetStatistics Statistiken zurcksetzen Bucket_LastReset L舫ft seit Bucket_CurrentColor Derzeitige Farbe von %s ist %s Bucket_SetColorTo Setze Farbe von %s auf %s Bucket_Maintenance Verwaltung Bucket_CreateBucket Erstelle Kategorie Bucket_DeleteBucket Lsche Kategorie Bucket_RenameBucket Benenne Kategorie um Bucket_Lookup Nachschlagen Bucket_LookupMessage Wort in Kategorie nachschlagen Bucket_LookupMessage2 Ergebnis fr Bucket_LookupMostLikely %s erscheint am wahrscheinlichsten in %s Bucket_DoesNotAppear

%s erscheint in keiner Kategorie Bucket_DisabledGlobally Global deaktiviert Bucket_To in Bucket_Quarantine Nachricht in Quarant舅e SingleBucket_Title Details fr %s SingleBucket_WordCount Anzahl Worte in dieser Kategorie SingleBucket_TotalWordCount Anzahl Worte insgesamt SingleBucket_Percentage Anteil an der Gesamtzahl SingleBucket_WordTable Worttabelle fr %s SingleBucket_Message1 Klicken Sie auf einen Buchstaben, um eine Liste der Wrter aufzurufen, die mit diesem beginnen. Klicken Sie auf ein beliebiges Wort, um die Wahrscheinlichkeit seines Erscheinens fr alle Kategorien anzusehen. SingleBucket_Unique %s verschiedene SingleBucket_ClearBucket Alle Wrter entfernen Session_Title POPFile Sitzung abgelaufen Session_Error Ihre POPFile-Sitzung ist abgelaufen. Dies knnte dadurch verursacht worden sein, da゚ Sie POPFile neu gestartet haben, das Kontrollzentrum aber noch im Browser geffnet war. Bitte klicken Sie auf einen der oben angezeigten Verweise, um mit der Benutzung von POPFile weitermachen zu knnen. View_Title Nachrichtenansicht View_ShowFrequencies Zeige H舫figkeit des Auftretens View_ShowProbabilities Zeige Wahrscheinlichkeit des Auftretens View_ShowScores Zeige Bewertung des Wortes View_WordMatrix Wort Matrix View_WordProbabilities zeige Wahrscheinlichkeit des Auftretens View_WordFrequencies zeige H舫figkeit des Auftretens View_WordScores zeige Bewertung des Wortes View_Chart Entscheidungs-Diagramm View_DownloadMessage Nachricht herunterladen Windows_TrayIcon POPFile-Symbol neben der Uhr anzeigen? Windows_Console POPFile in einem Konsolenfenster ausfhren? Windows_NextTime

Diese トnderung wird erst beim n臘hsten Start von POPFile wirksam. Header_MenuSummary Diese Tabelle ist das Navigationsmen, das Zugang zu den einzelnen Bereichen des Kontrollzentrums bietet. History_MainTableSummary Diese Tabelle zeigt Absender und Betreff der letzten empfangenen Nachrichten an und ermglicht es, diese durchzusehen und zu reklassifizieren. Ein Klick auf den Betreff zeigt die vollst舅dige Nachricht an sowie Details, warum diese so und nicht anders klassifiziert wurde. Die Spalte "Sollte sein" ermglicht es, anzugeben, in welche Kategorie die Nachricht gehrt bzw. entsprechende トnderungen rckg舅gig zu machen. Die Spalte "Delete" ermglicht es, einzelne Nachrichten aus dem Verlauf zu lschen, falls Sie diese nicht mehr bentigen. History_OpenMessageSummary Diese Tabelle enth舁t den kompletten Text einer Nachricht. Die Wrter sind entsprechend der Kategorie eingef舐bt, in die sie am wahrscheinlichsten passen. Bucket_MainTableSummary Diese Tabelle bietet einen ワberblick ber die einzelnen Kategorien. Jede Reihe zeigt Name, Gesamtzahl der Wrter und die Anzahl verschiedener Wrter pro Kategorie an, ob die Betreff-Zeile der Nachricht bei der Klassifizierung ge舅dert wird, ob die Nachrichten dieser Kategorie in Quarant舅e gestellt werden sollen, sowie eine Tabelle zur Auswahl einer Farbe, in der alle zu dieser Kategorie gehrenden Elemente im Kontrollzentrum dargestellt werden sollen. Bucket_StatisticsTableSummary Diese Tabelle zeigt drei verschiedene Statistiken bezglich POPFiles Gesamtleistung an. Die erste: Wie fehlerfrei ist die Einordnung in die entsprechenden Kategorien? Die zweite: Wie viele Nachrichten wurden analysiert und wie wurden sie eingeordnet? Die dritte: Wie viele Wrter gehren zu jeder Kategorie und wie hoch ist der Prozentsatz zur Gesamtzahl? Bucket_MaintenanceTableSummary Diese Tabelle enth舁t Formulare zum Erstellen, Lschen und Umbenennen von Kategorien und um die relative Wahrscheinlichkeit der Wrter in jeder einzelnen Kategorie nachzuschlagen. Bucket_AccuracyChartSummary Diese Tabelle stellt die Genauigkeit der Nachrichten-Sortierung grafisch dar. Bucket_BarChartSummary Diese Tabelle stellt einen Prozentanteil grafisch dar. Sie wird sowohl fr die Anzahl der eingestuften Nachrichten als auch fr die Gesamtzahl der Wrter genutzt. Bucket_LookupResultsSummary Diese Tabelle stellt die Wahrscheinlichkeiten bezglich jedes angegebenen Wortes dar. Fr jede Kategorie wird folgendes angezeigt: Die H舫figkeit, mit der das Wort auftritt, die Wahrscheinlichkeit, da゚ es in dieser Kategorie auftritt und die Auswirkungen auf die Punktzahl der Kategorie insgesamt, falls das Wort in einer Nachricht auftaucht. Bucket_WordListTableSummary Diese Tabelle bietet eine Liste aller Wrter einer bestimmten Kategorie - reihenweise sortiert nach dem ersten Buchstaben. Magnet_MainTableSummary Diese Tabelle zeigt eine Liste der Magnete an, die dazu benutzt werden, um Nachrichten automatisch nach festen Kriterien zu sortieren. Jede Reihe zeigt an, wie der Magnet definiert ist, in welche Kategorie er einsortiert und eine Schaltfl臘he, um den Magnet zu lschen. Configuration_MainTableSummary Diese Tabelle enth舁t einige Formulare zur Konfiguration von POPFile. Configuration_InsertionTableSummary Diese Tabelle enth舁t Schaltfl臘hen zur Konfiguration, ob bestimmte トnderungen an Kopfzeilen oder Betreff der Nachricht gemacht werden sollen, bevor diese an das entsprechende Programm weitergegeben wird. Security_MainTableSummary Diese Tabelle bietet Einstellungsmglichkeiten, die die Sicherheit von POPFile insgesamt betreffen, ob es automatisch auf neue Versionen prfen soll oder ob Statistiken ber die Leistung von POPFile an eine zentrale Datenbank zwecks der Erstellung von Gesamtstatistiken geschickt werden sollen. Advanced_MainTableSummary Diese Tabelle enth舁t eine Liste von Wrtern, die POPFile ignoriert, wenn es eine Nachricht analysiert. Dies betrifft Wrter, die besonders h舫fig in Nachrichten auftauchen. Diese sind reihenweise alphabetisch nach dem ersten Buchstaben sortiert. Imap_Bucket2Folder Mail der Kategorie '%s' kommt in den Ordner Imap_MapError Sie knnen nicht mehr als eine Kategorie einem einzelnen Ordner zuordnen! Imap_Server IMAP Server Hostname: Imap_ServerNameError Bitte geben Sie den Namen des Servers ein! Imap_Port IMAP Server Port: Imap_PortError Bitte geben Sie eine gltige Portnummer ein! Imap_Login IMAP Benutzername (Login): Imap_LoginError Bitte geben Sie einen gltigen Benuternamen ein! Imap_Password Password fr IMAP Konto: Imap_PasswordError Bitte geben Sie ein Passwort an! Imap_Expunge Gelschte Nachrichten aus den berwachten Ordnern endgltig lschen. Imap_Interval Update Intervall in Sekunden: Imap_IntervalError Bitte geben Sie ein Intervall zwischen 10 und 3600 Sekunden ein. Imap_Bytelimit Bytes pro Email, die zur Klassifikation genutzt werden. Geben Sie bitte 0 (Null) ein, um die komplette Nachricht zu nutzen. Imap_BytelimitError Bitte geben Sie eine Zahl ein. Imap_RefreshFolders Ordnerliste neu laden: Imap_Now jetzt! Imap_UpdateError1 Login war nicht erfolgreich. Bitte berprfen Sie Ihren Benutzernamen und das Passwort. Imap_UpdateError2 Verbindung zum Server fehlgeschlagen! Bitte berprfen Sie den Namen des Servers, den Port und stellen Sie sicher, dass Sie Zugang zum Internet haben. Imap_UpdateError3 Bitte konfigurieren Sie erst die Verbindung zum Server. Imap_NoConnectionMessage Bitte konfigurieren Sie erst die Verbindung zum Server. Nachdem Sie das getan haben, werden Sie an dieser Stelle mehr Konfigurationsmglichkeiten finden. Imap_WatchMore : einen weiteren zu berwachenden Ordner Imap_WatchedFolder ワberwachter Ordner Nr. Imap_Use_SSL SSL-gesicherte Verbindung Shutdown_Message POPFile wurde beendet Help_Training POPFile weiss zun臘hst einmal nichts ber Ihre Nachrichten und muss deshalb erst trainiert werden. Fr jede Kategorie muss mindestens eine Nachricht neu eingestuft worden sein, damit POPFile selber eine Einstufung vornehmen kann. Au゚erdem mssen Sie Ihr Mail-Programm so konfigurieren, dass es aufgrund der POPFile-Einstufung Ihre Emails filtert. Informationen ber die Konfiguration verschiedener Mail-Programme finden Sie (auf English) im POPFile Documentation Project. Help_Bucket_Setup POPFile braucht mindestens zwei Kategorien zus舩zlich zu der "unclassified" Pseudo-Kategorie. POPFile zeichnet sich durch die F臧igkeit aus, Emails in eine unbgrenzte Zahl von Kategorien einsortieren zu knnen. Eine einfache Konfiguration knnte zum Beispiel die Kategorien "spam", "beruflich" und "privat" enthalten. Help_No_More Diesen Hinweis nicht mehr zeigen popfile-1.1.3+dfsg/languages/Dansk.msg0000664000175000017500000005002411624177330017070 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode da LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage da # Common words that are used on their own all over the interface Apply Anvend On Til Off Fra TurnOn Sl til TurnOff Sl fra Add Tilfj Remove Fjern Previous Forrige Next N誑te From Fra Subject Emne Classification Klassificering Reclassify Genklassificering Undo Fortryd Close Luk Find Sg Filter Filtr駻 Yes Ja No Nej ChangeToYes Skift til Ja ChangeToNo Skift til Nej Bucket Spand Magnet Magnet Delete Slet Create Tilfj To Til Total Total Rename Omdb Frequency Frekvens Probability Sandsynlighed Score Resultat Lookup Sl op # The header and footer that appear on every UI page Header_Title POPFile Kontrolcenter Header_Shutdown Luk Header_History Historik Header_Buckets Spande Header_Configuration Indstillinger Header_Advanced Avanceret Header_Security Sikkerhed Header_Magnets Magneter Footer_HomePage POPFiles hjemmeside Footer_Manual Manual Footer_Forums Fora Footer_FeedMe Don駻 Footer_RequestFeature Foresl funktion Footer_MailingList Postliste Configuration_Error1 Skilletegnet skal v誡e et enkelt tegn Configuration_Error2 Kontrolcenterets port skal v誡e et tal mellem 1 og 65535 Configuration_Error3 POP3-porten skal v誡e et tal mellem 1 og 65535 Configuration_Error4 Sidens strelse skal v誡e mellem 1 og 1000 Configuration_Error5 Antal dage i historikken skal v誡e et tal mellem 1 og 366 Configuration_Error6 TCP-timeouten skal v誡e et tal mellem 10 og 1800 Configuration_Error7 XML-RPC-porten skal v誡e et tal mellem 1 og 65535 Configuration_POP3Port POP3-port Configuration_POP3Update Opdaterede POP3-porten til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Configuration_XMLRPCUpdate Opdaterede XML-RPC-porten til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Configuration_XMLRPCPort XML-RPC-port Configuration_SMTPPort SMTP-port Configuration_SMTPUpdate Opdaterede SMTP-porten til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Configuration_NNTPPort NNTP-port Configuration_NNTPUpdate Opdaterede NNTP-porten til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Configuration_POP3Separator POP3 v誡t:port:bruger-skilletegn Configuration_NNTPSeparator NNTP v誡t:port:bruger-skilletegn Configuration_POP3SepUpdate Opdaterede POP3-skilletegn til %s Configuration_NNTPSepUpdate Opdaterede NNTP-skilletegn til %s Configuration_UI Kontrolcenterets webport Configuration_UIUpdate Opdaterede kontrolcenterets webport til %s; denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Configuration_History Antal breve pr. side Configuration_HistoryUpdate Opdaterede antal breve pr. side til %s Configuration_Days Antal dage historikken skal beholdes Configuration_DaysUpdate Opdaterede antal dage historikken skal beholdes til %s Configuration_UserInterface Kontrolcenter Configuration_Skins Skins Configuration_SkinsChoose V詬g skin Configuration_Language Sprog Configuration_LanguageChoose V詬g sprog Configuration_ListenPorts POP3-port Configuration_HistoryView Historik Configuration_TCPTimeout TCP-forbindelsens timeout Configuration_TCPTimeoutSecs TCP-forbindelsens timeout i sekunder Configuration_TCPTimeoutUpdate Opdaterede TCP-forbindelsens timeout til %s Configuration_ClassificationInsertion Klassificering Configuration_SubjectLine Emnelinie-modifikation Configuration_XTCInsertion X-Text-Classification Configuration_XPLInsertion X-POPFile-Link Configuration_Logging Logning Configuration_None Ingen Configuration_ToScreen Til sk誡m Configuration_ToFile Til fil Configuration_ToScreenFile Til sk誡m og fil Configuration_LoggerOutput Log Configuration_GeneralSkins Skins Configuration_SmallSkins Sm skins Configuration_TinySkins Meget sm skins Advanced_Error1 '%s' er allerede i stopordslisten Advanced_Error2 Stopord kan kun indeholde tal og bogstaver, samt ., _, -, eller @. Advanced_Error3 '%s' er tilfjet til stopordslisten Advanced_Error4 '%s' er ikke i stopordslisten Advanced_Error5 '%s' er fjernet fra stopordslisten Advanced_StopWords Stopord Advanced_Message1 Flgende ord bliver ignoreret under alle klassificeringer p grund af deres hyppighed: Advanced_AddWord Tilfj ord Advanced_RemoveWord Fjern ord History_Filter  (vis kun spanden %s) History_FilterBy Filtr駻 med History_Search  (sg emne for %s) History_Title Seneste beskeder History_Jump Spring til besked History_ShowAll Vis alle History_ShouldBe Skal v誡e History_NoFrom Ingen fra-linie History_NoSubject Ingen emne-linie History_ClassifyAs Klassificeret som History_MagnetUsed Magnet brugt History_ChangedTo Skift til %s History_Already Allerede genklassificeret som %s History_RemoveAll Fjern alle History_RemovePage Fjern side History_Remove Fjern breve i historikken ved at trykke History_SearchMessage Sg i Fra/Emne History_NoMessages Ingen breve History_ShowMagnet Magnetiseret History_Magnet  (viser kun magnet-klassificerede meddelelser) History_ResetSearch Nulstil Password_Title Kodeord Password_Enter Indtast kodeord Password_Go OK Password_Error1 Forkert kodeord Security_Error1 Den sikre port skal v誡e et tal mellem 1 og 65535 Security_Stealth Sikker tilstand/Server Security_NoStealthMode Nej (Sikker tilstand) Security_ExplainStats (Med denne funktion sl蘰t til sender POPFile en gang om dagen tre v誡dier til et script hos wwwu.sethesource.com:
bc (antallet af dine spande),
mc (antallet af breve, POPFile har klassificeret) og
ec (antallet af klassificeringsfejl). Disse tal bliver gemt i en fil. Jeg vil bruge disse data til at offentliggre en statistik over hvordan folk bruger POPFile og hvor godt POPFile virker. Min web server gemmer denne logfil i ca. 5 dage, hvorefter de bliver slettet; Jeg gemmer ingen sammenh誅g mellem statistikken og individuelle IP adresser.) Security_ExplainUpdate (Med denne funktion sl蘰t til sender POPFile en gang om dagen tre v誡dier til et script hos wwwu.sethesource.com:
ma (det store versionsnummer p din installerede POPFile),
mi (det lille versionsnummer p din installerede POPFile) og
bn (build-nummeret p din installerede POPFile).
POPFile modtager et svar i form af et stykke grafik, som vises i toppen af siden, hvis en ny version er til r蘚ighed. Min web server gemmer denne logfil i ca. 5 dage, hvorefter de bliver slettet; Jeg gemmer ingen sammenh誅g mellem statistikken og individuelle IP adresser.) Security_PasswordTitle Kontrolcenterets kodeord Security_Password Kodeord Security_PasswordUpdate Opdater kodeord til %s Security_AUTHTitle Godkendelse af sikker adgangskode Security_SecureServer Sikker server Security_SecureServerUpdate Opdaterede sikker server til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Security_SecurePort Sikker port Security_SecurePortUpdate Opdaterede den sikre port til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Security_SMTPServer SMTP-k訶e-server Security_SMTPServerUpdate Opdaterede SMTP-k訶e-server til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Security_SMTPPort SMTP-k訶e-port Security_SMTPPortUpdate Opdaterede SMTP-k訶e-port til %s. Denne 誅dring vil ikke tr訶e i kraft fr POPFile er genstartet Security_POP3 Accept駻 POP3-tilslutninger fra andre maskiner (kr誚er at POPFile genstartes) Security_SMTP Accept駻 SMTP-tilslutninger fra andre maskiner (kr誚er at POPFile genstartes) Security_NNTP Accept駻 NNTP-tilslutninger fra andre maskiner (kr誚er at POPFile genstartes) Security_UI Accept駻 HTTP(kontrolcenter)-tilslutninger fra andre maskiner Security_XMLRPC Accept駻 XML-RPC-tilslutninger fra andre maskiner (kr誚er at POPFile genstartes) Security_UpdateTitle Automatisk opdateringscheck Security_Update Check dagligt, om der er opdateringer af POPFile Security_StatsTitle Statistikrapportering Security_Stats Send statistikkerne tilbage til John dagligt Magnet_Error1 Magneten '%s' eksisterer allrede i spanden '%s' Magnet_Error2 Den nye magnet '%s' er i konflikt med magneten '%s' i spanden '%s' og kunne skabe flertydige resultater. Den nye magnet er ikke tilfjet. Magnet_Error3 Tilfjede den nye magnet '%s' i spanden '%s' Magnet_CurrentMagnets Magneter i brug Magnet_Message1 Magneterne f蚌 breve til altid at blive klassificeret til den specificerede spand. Magnet_CreateNew Tilfj nye magneter Magnet_Explanation Der findes tre typer magneter:

  • "Fra:"-adresse eller -navn: For eksempel: john@firma.dk for at matche en specifik adresse,
    firma.dk for at matche alle, der sender fra firma.dk,
    John Doe for at matche en specifik person, John for at matche alle John'er.
  • "Til:"-adresse eller -navn: Lige som en "Fra:"-magnet, men bare for "Til:"-adressen i et brev.
  • Ord i emnet For eksempel: hej for at matche alle breve med ordet hej i emnet.
Magnet_MagnetType Magnettyper Magnet_Value V誡dier Magnet_Always Tilhrer altid spanden Bucket_Error1 Spandenes navne kan kun indholde bogstaverne a til z med sm bogstaver, samt - og _ Bucket_Error2 Spanden med navnet %s findes allerede Bucket_Error3 Opret spanden med navnet %s Bucket_Error4 Skriv venligst et ikke-tomt ord Bucket_Error5 Omdb spanden %s til %s Bucket_Error6 Slet spanden %s Bucket_Title Oversigt Bucket_BucketName Spandenes navne Bucket_WordCount Ordt詬ling Bucket_WordCounts Ordfordeling Bucket_UniqueWords Unikke ord Bucket_SubjectModification Emnemodifikation Bucket_ChangeColor Skift farve Bucket_NotEnoughData Ikke nok data Bucket_ClassificationAccuracy Klassificeringsnjagtighed Bucket_EmailsClassified Klassificerede breve Bucket_EmailsClassifiedUpper Klassificerede breve Bucket_ClassificationErrors Klassificeringsfejl Bucket_Accuracy Njagtighed Bucket_ClassificationCount Antal Bucket_ResetStatistics Nulstil Statistikkerne Bucket_LastReset Sidst nulstillet Bucket_CurrentColor %s's aktuelle farve er %s Bucket_SetColorTo S誥 %s-farven til %s Bucket_Maintenance Vedligeholdelse Bucket_CreateBucket Opret spanden med navnet Bucket_DeleteBucket Slet spanden med navnet Bucket_RenameBucket Omdb spanden med navnet Bucket_Lookup Sl op Bucket_LookupMessage Sl ord op i spandene Bucket_LookupMessage2 Opslagsresultatet for Bucket_LookupMostLikely Det er mest sandsynligt at %s forekommer i %s Bucket_DoesNotAppear

%s forekommer ikke i nogle af spandene Bucket_DisabledGlobally Deaktiveret globalt Bucket_To til Bucket_Quarantine S誥 i karant誅e SingleBucket_Title Detaljer for %s SingleBucket_WordCount Antal ord i spanden SingleBucket_TotalWordCount Antal ord i alt SingleBucket_Percentage Procent af alle ord SingleBucket_WordTable Ordtabel for %s SingleBucket_Message1 Markerede (*) ord er blevet brugt til at klassificere i denne POPFile-session. Tryk p et ord for at sl dets sandsynlighed op for alle spandene. SingleBucket_Unique %s unikke Session_Title POPFile-session udlbet Session_Error Din POPFile-session er udlbet. Dette kan skyldes, at du har stoppet og genstartet POPFile uden at lukke din browser. Klik venligst p et af linkene ovenfor for at forts誥te med at bruge POPFile. Header_MenuSummary Denne tabel er navigationsmenuen, som giver adgang til kontrolcenterets forskellige sider. History_MainTableSummary Denne tabel viser afsenderen og emnet p breve modtaget for nyligt og giver dig mulighed for at vurdere og reklassificere dem. Hvis du klikker p emnelinien vil hele brevets tekst blive vist, sammen med oplysninger om, hvorfor det blev klassificeret som det blev. Kolonnen "skal v誡e" giver dig mulighed for at angive, hvilken spand brevet hrer til i, eller til at fortryde denne 誅dring. Kolonnen "Slet" giver dig mulighed for at slette enkelte breve fra historikken, hvis du ikke l誅gere har brug for dem. History_OpenMessageSummary Denne tabel indeholder et brevs fulde ordlyd, med ngleordene, som er brugt til klassificering, markeret svarende til den spand, der er mest relevant for dem. Bucket_MainTableSummary Denne tabel giver et overblik over klassificerings-spandene. Hver r詭ke viser spandens navn, antallet af optalte ord for spanden, antallet af unikke ord i spanden, om brevets emnelinie vil blive modificeret, n蚌 det klassificeres til spanden, om brevet skal s誥tes i karant誅e, n蚌 det lander i spanden, samt en tabel til at v詬ge hvilken farve, der skal knyttes til spanden. Farven vil blive brugt til alt, hvad der har at gre med spanden i kontrolcenteret. Bucket_StatisticsTableSummary Denne tabel viser tre s誥 af statistikker over POPFiles ydelse. Den frste viser, hvor njagtigt klassificeringen er, den n誑te viser hvor mange breve, der er blevet klassificeret og til hvilke spande, og den tredie viser, hvor mange ord der er i hver spand, samt deres relative procentandel. Bucket_MaintenanceTableSummary Denne tabel giver dig mulighed for at oprette, slette og omdbe spande, og til at sl et ord op i alle spandene for se dets relative sandsynligheder. Bucket_AccuracyChartSummary Denne tabel viser en grafisk repr誑entation af njagtigheden af brevklassificeringen. Bucket_BarChartSummary Denne tabel viser en grafisk repr誑entation af den procentvise fordeling spandene imellem. Den viser b蘚e antallet af klassificerede breve og det totale antal ord. Bucket_LookupResultsSummary Denne tabel viser sandsynlighederne, der er knyttet til hvert ord i korpusset. For hver spand viser den frekvensen, som ordet forekommer med, sandsynligheden for at det vil forekomme i spanden, samt den samlede effekt p spandens score, ordet vil have, hvis det forekommer i et brev. Bucket_WordListTableSummary Denne tabel viser alle ordene i en given spand organiseret alfabetisk i r詭ker. Magnet_MainTableSummary Denne tabel viser en liste over magneter, der bruges til automatisk at klassificere breve i henhold til faste regler. Hver r詭ke viser hvordan magneten er defineret, hvilken spand, den er beregnet p, samt en knap til at slette magneten med. Configuration_MainTableSummary Denne tabel giver dig mulighed for at indstille POPFile. Configuration_InsertionTableSummary Denne tabel indeholder knapperne, der bestemmer, hvorvidt bestemte 誅dringer bliver lavet i brevets headere eller emnelinier, fr det sendes videre til dit e-postprogram. Security_MainTableSummary Denne tabel indeholder kontroller, der vedrrer POPFiles almene sikkerhed, hvorvidt programmet automatisk skal undersge, om der er opdateringer tilg誅gelige p Internettet samt om der skal sendes statistik om programmets ydelse til programmets forfatter med henblik p offentliggrelse. Advanced_MainTableSummary Denne tabel indeholder en liste over stopord, som POPFile ignorerer p grund af deres hyppighed, n蚌 det klassificerer breve. De er organiseret alfabetisk i r詭ker. popfile-1.1.3+dfsg/languages/Czech.msg0000664000175000017500000005007511624177330017072 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Translation Jan Chochola (jchochola@volny.cz) # Identify the language and character set used for the interface LanguageCode cz LanguageCharset windows-1250 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # Common words that are used on their own all over the interface Apply Pou橲t On Zapnuto Off Vypnuto TurnOn Zapnout TurnOff Vypnout Add Pidat Remove Odstranit Previous Pedchoz Next N疽ledujc From Od Subject Pedmt Cc Cc Classification Klasifikace Reclassify Znova klasifikovat Probability Pravdpodobnost Scores Skre QuickMagnets QuickMagnety Undo Vr疸it Close Zavt Find Hledat Filter Filtr Yes Ano No Ne ChangeToYes Zmnit na Ano ChangeToNo Zmnit na Ne Bucket Ko Magnet Magnet Delete Odstranit Create Vytvoit To Pjemce Total Celkem Rename Pejmenovat Frequency Frekvence Lookup Hled疣 Word Slovo Count Po鐺t Update Aktualizace Refresh Obnovit # The header and footer that appear on every UI page Header_Title Ovl疆ac panel POPFile Header_Shutdown Ukon鑛t POPFile Header_History Historie Header_Buckets Ko啼 Header_Configuration Konfigurace Header_Advanced Roz夬en Header_Security Zabezpe鐺n Header_Magnets Magnety Footer_HomePage Domovsk str疣ka POPFile Footer_Manual Manu疝 Footer_Forums Fra Footer_FeedMe Podpote vvoj Footer_RequestFeature Po杪davek na funkci Footer_MailingList Mailing List Configuration_Error1 Oddlova mus bt jedin znak Configuration_Error2 Port u枴vatelsk馼o rozhran mus bt 竟slo mezi 1 a 65535 Configuration_Error3 Port protokolu POP3 mus bt 竟slo mezi 1 a 65535 Configuration_Error4 Velikost str疣ky mus bt 竟slo mezi 1 a 1000 Configuration_Error5 Po鐺t dn platnosti historie mus bt 竟slo mezi 1 a 366 Configuration_Error6 Doba 鐺k疣 TCP mus bt 竟slo mezi 10 a 1800 Configuration_Error7 Port pro XML-RPC mus bt 竟slo mezi 1 a 65535 Configuration_POP3Port Port protokolu POP3 Configuration_POP3Update Nov port POP3 je %s; tato zmna se projev a po restartu POPFile Configuration_XMLRPCUpdate Nov port pro XML-RPC je %s; tato zmna se projev a po restartu POPFile Configuration_XMLRPCPort Port pro XML-RPC Configuration_SMTPPort Port protokolu SMTP Configuration_SMTPUpdate Nov port pro SMTP je %s; tato zmna se projev a po restartu POPFile Configuration_NNTPPort Port protokolu NNTP Configuration_NNTPUpdate Nov port pro NNTP je %s; tato zmna se projev a po restartu POPFile Configuration_POP3Separator Oddlovac znak pro POP3 host:port:user Configuration_NNTPSeparator Oddlovac znak pro NNTP host:port:user Configuration_POP3SepUpdate Nov oddlova pro POP3 je %s Configuration_NNTPSepUpdate Nov oddlova pro NNTP je %s Configuration_UI Port webov馼o u枴vatelsk馼o rozhran Configuration_UIUpdate Nov port webov馼o u枴vatelsk馼o rozhran je %s; tato zmna se projev a po restartu POPFile Configuration_History Po鐺t zpr疱 na str疣ce Configuration_HistoryUpdate Nov po鐺t zpr疱 na str疣ce je %s Configuration_Days Po鐺t dn platnosti historie Configuration_DaysUpdate Nov po鐺t dn platnosti historie je %s Configuration_UserInterface U枴vatelsk rozhran Configuration_Skins Vzhled Configuration_SkinsChoose Zvolit vzhled Configuration_Language Jazyk Configuration_LanguageChoose Zvolit jazyk Configuration_ListenPorts Porty Configuration_HistoryView Zobrazen historie Configuration_TCPTimeout ネek疣 na spojen Configuration_TCPTimeoutSecs ネek疣 na spojen v sekund當h Configuration_TCPTimeoutUpdate Nov 鐺k疣 na spojen je %s Configuration_ClassificationInsertion Vkl疆疣 textu do zpr疱y Configuration_SubjectLine Zmna pedmtu zpr疱y Configuration_XTCInsertion Pid疣 hlavi鑢y X-Text-Classification Configuration_XPLInsertion Pid疣 hlavi鑢y X-POPFile-Link Configuration_Logging Protokolov疣 Configuration_None Nen Configuration_ToScreen Na obrazovku Configuration_ToFile Do souboru Configuration_ToScreenFile Na obrazovku i do souboru Configuration_LoggerOutput Protokol Configuration_GeneralSkins Vzhled Configuration_SmallSkins Mal Configuration_TinySkins Drobn Configuration_CurrentLogFile <aktu疝n protokol> Advanced_Error1 '%s' je u v seznamu ignorovanch slov Advanced_Error2 Ignorovan slova mohou obsahovat jen alfanumerick znaky a znaky '.', '_', '-' nebo '@' Advanced_Error3 '%s' pid疣o do seznamu ignorovanch slov Advanced_Error4 '%s' nen v seznamu ignorovanch slov Advanced_Error5 '%s' odstranno ze seznamu ignorovanch slov Advanced_StopWords Ignorovan slova Advanced_Message1 POPFile ignoruje tato 鐶sto u橲van slova: Advanced_AddWord Pidat slovo Advanced_RemoveWord Odebrat slovo History_Filter  (zobrazuje se ko %s) History_FilterBy Filtr History_Search  (vyhled疣o podle Odeslatele/Pedmtu %s) History_Title Posledn zpr疱y History_Jump Pejt ke zpr疱 History_ShowAll Uk痙at v啼 History_ShouldBe M bt History_NoFrom sch痙 疆ek 'Odeslatel' History_NoSubject sch痙 疆ek 'Pedmt' History_ClassifyAs Klasifikovat jako History_MagnetUsed Pou枴t magnet History_MagnetBecause Pou枴t magnet

Klasifikov疣o jako %s, proto枡 byl pou枴t magnet %s

History_ChangedTo Zmnno na %s History_Already Klasifikace ji zmnna na %s History_RemoveAll Odstranit v啼 History_RemovePage Odstranit str疣ku History_Remove Kliknout pro odstrann polo枡k v historii History_SearchMessage Hledat Odeslatele/Pedmt History_NoMessages Zpr疱a nenalezena History_ShowMagnet zmagnetov疣o History_ShowNoMagnet nezmagnetov疣o History_Magnet  (jen zpr疱y klasifikovan magnetem) History_NoMagnet  (jen zpr疱y neklasifikovan magnetem) History_ResetSearch Vynulovat Password_Title Heslo Password_Enter Vlo枴t heslo Password_Go Vstoupit Password_Error1 Nespr疱n heslo Security_Error1 Port mus bt 竟slo mezi 1 a 65535 Security_Stealth Utajen re枴m/re枴m serveru Security_NoStealthMode Ne (Utajen re枴m) Security_ExplainStats (Pokud je to zapnuto, POPFile jedenkr疸 denn ode嗟e skriptu na getpopfile.org n疽ledujc daje: bc [celkov po鐺t ko奠], mc [celkov po鐺t zpr疱, kter POPFile klasifikoval] a ec [celkov po鐺t chyb klasifikace]. Tyto daje jsou ukl疆疣y a pou枴ji je pro statistiku o tom, jak lid POPFile pou橲vaj a jak je sp嗜. Mj web server data udr柆je 5 dn a pak je ru夬. Neukl疆 se 榱dn informace o propojen mezi statistikami a pslu嗜mi IP adresami.) Security_ExplainUpdate (Pokud je to zapnuto, POPFile jedenkr疸 denn ode嗟e skriptu na getpopfile.org n疽ledujc daje: ma [hlavn 竟slo verze va啼ho POPFile], mi [vedlej夬 竟slo verze] a bn (竟slo sestaven POPFile). Pokud je dostupn nov verze, POPFile to graficky zobraz v horn 鞦sti str疣ky. Mj web server data udr柆je 5 dn a pak je ru夬. Neukl疆 se 榱dn informace o propojen mezi daji a pslu嗜mi IP adresami.) Security_PasswordTitle Heslo u枴vatelsk馼o rozhran Security_Password Heslo Security_PasswordUpdate Nov heslo je %s Security_AUTHTitle Vzd疝en servery Security_SecureServer Server POP3 SPA/AUTH Security_SecureServerUpdate Nov bezpe鈩 server POP3 SPA/AUTH je %s; tato zmna se projev a po restartu POPFile Security_SecurePort Port pro POP3 SPA/AUTH Security_SecurePortUpdate Nov port pro POP3 SPA/AUTH je %s; tato zmna se projev a po restartu POPFile Security_SMTPServer Zetzen SMTP server Security_SMTPServerUpdate Nov zetzen SMTP server je %s; tato zmna se projev a po restartu POPFile Security_SMTPPort Port pro zetzen SMTP server Security_SMTPPortUpdate Nov port pro zetzen SMTP server je %s; tato zmna se projev a po restartu POPFile Security_POP3 Pijmout POP3 spojen od vzd疝ench po竟ta顋 (vy杪duje restart POPFile) Security_SMTP Pijmout SMTP spojen od vzd疝ench po竟ta顋 (vy杪duje restart POPFile) Security_NNTP Pijmout NNTP spojen od vzd疝ench po竟ta顋 (vy杪duje restart POPFile) Security_UI Pijmout HTTP (u枴vatelsk rozhran) spojen od vzd疝ench po竟ta顋 (vy杪duje restart POPFile) Security_XMLRPC Pijmout XML-RPC spojen od vzd疝ench po竟ta顋 (vy杪duje restart POPFile) Security_UpdateTitle Automatick kontrola verze Security_Update Denn kontrolovat dostupnost aktualizace POPFile Security_StatsTitle Hl癩en statistik Security_Stats Denn odeslat statistiky Magnet_Error1 Magnet '%s' u je v ko喨 '%s' Magnet_Error2 Nov magnet '%s' koliduje s magnetem '%s' v ko喨 '%s' a mohl by zpsobit nejednozna鈩 vsledky. Nov magnet nebyl pid疣. Magnet_Error3 Vytvoit nov magnet '%s' v ko喨 '%s' Magnet_CurrentMagnets Platn magnety Magnet_Message1 N疽ledujc magnety zpsob, 枡 zpr疱y budou v枦y zaazeny do ur鐺n馼o ko啼. Magnet_CreateNew Zalo枴t nov magnet Magnet_Explanation Jsou dostupn tyto typy magnet:
  • From: Adresa nebo jm駭o odeslatele: Napklad: john@company.com pro konkr騁n adresu,
    company.com pro v啼chny odeslatele z company.com,
    John Doe pro konkr騁n osobu, John pro v啼chny Johny
  • To/Cc: Adresa nebo jm駭o pjemce/pjemc: Obdobn jako magnet From: pro adresy pjemc (hlavi鑢y To: a Cc:).
  • Subject: slova v pedmtuNapklad: hello pro v啼chny zpr疱y se slovem hello v pedmtu
Magnet_MagnetType Typ magnetu Magnet_Value Hodnota Magnet_Always Zaadit v枦y do ko啼 Magnet_Jump Pechod na str疣ku magnet Bucket_Error1 Jm駭a ko奠 mohou obsahovat jen mal psmena 'a' a 'z', 竟slice '0' a '9', a znaky '-' a '_' Bucket_Error2 Ko %s ji existuje Bucket_Error3 Ko %s byl zalo枡n Bucket_Error4 Vlo柎e nepr痙dn slovo Bucket_Error5 Ko %s byl pejmenov疣 na %s Bucket_Error6 Ko %s byl odstrann Bucket_Title Shrnut Bucket_BucketName Jm駭o ko啼 Bucket_WordCount Po鐺t slov Bucket_WordCounts Po鑼y slov Bucket_UniqueWords Unik疸n slova Bucket_SubjectModification Modifikace pedmtu Bucket_ChangeColor Zmna barvy Bucket_NotEnoughData Pli m疝o dat Bucket_ClassificationAccuracy Pesnost klasifikace Bucket_EmailsClassified Po鐺t klasifikovanch zpr疱 Bucket_EmailsClassifiedUpper Po鐺t klasifikovanch zpr疱 Bucket_ClassificationErrors Chyby klasifikace Bucket_Accuracy Pesnost Bucket_ClassificationCount Po鐺t klasifikac Bucket_ClassificationFP Po鐺t chyb "False Positive" Bucket_ClassificationFN Po鐺t chyb "False Negative" Bucket_ResetStatistics Vynulovat statistiky Bucket_LastReset Posledn nulov疣 Bucket_CurrentColor %s m barvu %s Bucket_SetColorTo Nastavit barvu %s na %s Bucket_Maintenance レdr枌a Bucket_CreateBucket Zalo枴t ko s n痙vem Bucket_DeleteBucket Odstranit ko s n痙vem Bucket_RenameBucket Pejmenovat ko s n痙vem Bucket_Lookup Vyhled疣 Bucket_LookupMessage Vyhledat slovo v ko夬ch Bucket_LookupMessage2 Vsledky hled疣 Bucket_LookupMostLikely %s se nej鐶stji objevuje v ko喨 %s Bucket_DoesNotAppear

%s se nena嗟o v 榱dn駑 ko喨 Bucket_DisabledGlobally Glob疝n vypnuto Bucket_To na Bucket_Quarantine Karant駭a SingleBucket_Title Detail %s SingleBucket_WordCount Po鐺t slov v ko喨 SingleBucket_TotalWordCount Celkov po鐺t slov SingleBucket_Percentage Procento SingleBucket_WordTable Tabulka slov pro %s SingleBucket_Message1 Pro zobrazen slov za竟najcch ur鑛tm psmenem je mo柤o kliknout na toto psmeno v indexu. Kliknutm na slovo se zobraz jeho pravdpodobnosti pro v啼chny ko啼. SingleBucket_Unique %s unik疸nch SingleBucket_ClearBucket Odstranit v啼chna slova Session_Title Relace POPFile vypr啼la Session_Error Va啼 relace POPFile vypr啼la. To m枡 bt zpsobeno zastavenm a novm spu嗾nm POPFile, zatmco prohl枡 zstal oteven. Pro pokra鑰v疣 pr當e s POPFile je nutno kliknout na nkter z odkaz nahoe. View_Title Pohled na jednu zpr疱u Header_MenuSummary Tato tabulka tvo naviga鈩 menu umo橙ujc pstup k jednotlivm str疣k疥 Ovl疆acho panelu. History_MainTableSummary Tato tabulka zobrazuje odeslatele a pedmt doru鐺nch zpr疱 a umo橙uje jejich prohl馘nut a zmnu klasifikace. Po kliknut na pedmt se zobraz cel text zpr疱y sou鐶sn s informac, pro byla klasifikov疣a tak, jak byla. Sloupec 'M bt' umo橙uje ur鑛t ko, do kter馼o zpr疱a pat, nebo odvolat tuto zmnu. Sloupec 'Odstranit' umo橙uje zru喨t zpr疱y, kter ji nejsou zapoteb. History_OpenMessageSummary Tato tabulka obsahuje cel text zpr疱y. Slova pou枴t pi klasifikaci jsou ozna鐺na barvou ko啼, pro kter jsou nejvce relevantn. Bucket_MainTableSummary Tato tabulka poskytuje pehled klasifika鈩ch ko奠. Ka枦 疆ek obsahuje jm駭o ko啼, celkov po鐺t slov pro dan ko, aktu疝n po鐺t slov, zda je pi klasifikaci modifikov疣 pedmt zpr疱y, zda jsou zpr疱y umis捐v疣y do karant駭y, a tabulka pro vbr barvy ko啼. Bucket_StatisticsTableSummary Tato tabulka poskytuje ti sady statistickch daj o 鑛nnosti POPFile. Prvn z nich zobrazuje pesnost klasifikace, druh po鐺t klasifikovanch zpr疱 pro jednotliv ko啼 a tet po鑼y slov v jednotlivch ko夬ch a jejich relativn zastoupen. Bucket_MaintenanceTableSummary Tato tabulka obsahuje formul碾e pro zakl疆疣, ru啼n a pejmenov疱疣 ko奠 a pro vyhled疣 slova v ko夬ch a zji嗾n jeho relativn pravdpodobnosti. Bucket_AccuracyChartSummary Tato tabulka graficky zn痙oruje pesnost klasifikace zpr疱. Bucket_BarChartSummary Tato tabulka graficky zn痙oruje relativn zastoupen klasifikovanch zpr疱 a celkov馼o po鑼u slov pro jednotliv ko啼. Bucket_LookupResultsSummary Tato tabulka poskytuje pravdpodobnosti pro ka枦 slovo z korpusu. Pro ka枦 ko je zobrazena frekvence vskytu slova, pravdpodobnost, 枡 se v ko喨 objev, a celkov vliv na skre pro dan ko, pokud se ve zpr疱 vyskytuje. Bucket_WordListTableSummary Tato tabulka nabz seznam v啼ch slov pro dan ko. Magnet_MainTableSummary Tato tabulka zobrazuje seznam v啼ch magnet, kter jsou pou枴ty pro automatickou klasifikaci zpr疱 podle pevnch pravidel. Ka枦 疆ek obsahuje informace o tom, jak je magnet definov疣 a pro kter ko je ur鐺n, a tla竟tko pro jeho zru啼n. Configuration_MainTableSummary Tato tabulka obsahuje adu formul碾 ur鐺nch k nastavov疣 konfigurace POPFile. Configuration_InsertionTableSummary Tato tabulka osahuje tla竟tka ur鑾jc, zda se budou prov疆t ur鑛t modifikace hlavi鑢y zpr疱y ped jejm ped疣m po嗾ovnmu klientu. Security_MainTableSummary Tato tabulka umo橙uje nastavit zabezpe鐺n konfigurace POPFile, automatickou kontrolu novch verz programu a zasl疣 statistickch daj do centr疝nho lo枴嗾 autora. Advanced_MainTableSummary Tato tabulka obsahuje seznam slov, kter POPFile pi klasifikaci pro jejich vysokou 鐺tnost ve zpr疱當h ignoruje. popfile-1.1.3+dfsg/languages/Chinese-Traditional.msg0000664000175000017500000006721611624177330021671 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # POPFile 1.0.0 Traditional Chinese Translation # Created By Jedi Lin, 2004/09/19 # Modified By Jedi Lin, 2007/12/25 # Identify the language and character set used for the interface LanguageCode tw LanguageCharset UTF8 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage zh-tw # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply 螂礼畑 ApplyChanges 螂礼畑隶頑峩 On 髢 Off 髣 TurnOn 謇馴幕 TurnOff 髣應ク Add 蜉蜈・ Remove 遘サ髯、 Previous 蜑堺ク鬆 Next 荳倶ク鬆 From 蟇莉カ閠 Subject 荳サ譌ィ Cc 蜑ッ譛ャ Classification 驛オ遲 Reclassify 驥肴眠蛻鬘 Probability 蜿ッ閭ス諤ァ Scores 蛻謨ク QuickMagnets 蠢ォ騾溷精髏オ Undo 驍蜴 Close 髣憺哩 Find 蟆区伽 Filter 驕取ソセ蝎ィ Yes 譏ッ No 蜷ヲ ChangeToYes 謾ケ謌先弍 ChangeToNo 謾ケ謌仙凄 Bucket 驛オ遲 Magnet 蜷ク髏オ Delete 蛻ェ髯、 Create 蟒コ遶 To 謾カ莉カ莠コ Total 蜈ィ驛ィ Rename 譖エ蜷 Frequency 鬆サ邇 Probability 蜿ッ閭ス諤ァ Score 蛻謨ク Lookup 譟・謇セ Word 蟄苓ゥ Count 險域丙 Update 譖エ譁ー Refresh 驥肴眠謨エ逅 FAQ 蟶ク隕句撫遲秘寔 ID ID Date 譌・譛 Arrived 謾カ莉カ譎る俣 Size 螟ァ蟆 # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %m/%d %T %z | %A %Y/%m/%d %T %z # The header and footer that appear on every UI page Header_Title POPFile 謗ァ蛻カ荳ュ蠢 Header_Shutdown 蛛懈脂 POPFile Header_History 豁キ蜿イ Header_Buckets 驛オ遲 Header_Configuration 邨諷 Header_Advanced 騾イ髫 Header_Security 螳牙ィ Header_Magnets 蜷ク髏オ Footer_HomePage POPFile 鬥夜 Footer_Manual 謇句 Footer_Forums 險手ォ門項 Footer_FeedMe 謐仙勧 Footer_RequestFeature 蜉溯ス隲区ア Footer_MailingList 驛オ驕櫁ォ夜。 Footer_Wiki 譁莉カ髮 Configuration_Error1 蛻髫皮ャヲ逾閭ス譏ッ蝟ョ荳逧蟄礼ャヲ Configuration_Error2 菴ソ逕ィ閠莉矩擇逧騾」謗・蝓荳螳夊ヲ∽サ区名 1 蜥 65535 荵矩俣 Configuration_Error3 POP3 閨閨ス騾」謗・蝓荳螳夊ヲ∽サ区名 1 蜥 65535 荵矩俣 Configuration_Error4 鬆髱「螟ァ蟆丈ク螳夊ヲ∽サ区名 1 蜥 1000 荵矩俣 Configuration_Error5 豁キ蜿イ陬剰ヲ∽ソ晉蕗逧譌・謨ク荳螳夊ヲ∽サ区名 1 蜥 366 荵矩俣 Configuration_Error6 TCP 騾セ譎ょシ荳螳夊ヲ∽サ区名 10 蜥 1800 荵矩俣 Configuration_Error7 XML RPC 閨閨ス騾」謗・蝓荳螳夊ヲ∽サ区名 1 蜥 65535 荵矩俣 Configuration_Error8 SOCKS V 莉」逅莨コ譛榊勣騾」謗・蝓荳螳夊ヲ∽サ区名 1 蜥 65535 荵矩俣 Configuration_POP3Port POP3 閨閨ス騾」謗・蝓 Configuration_POP3Update POP3 騾」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Configuration_XMLRPCUpdate XML-RPC 騾」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Configuration_XMLRPCPort XML-RPC 閨閨ス騾」謗・蝓 Configuration_SMTPPort SMTP 閨閨ス騾」謗・蝓 Configuration_SMTPUpdate SMTP 騾」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Configuration_NNTPPort NNTP 閨閨ス騾」謗・蝓 Configuration_NNTPUpdate NNTP 騾」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Configuration_POPFork 蜈∬ィア驥崎、逧 POP3 騾」邱 Configuration_SMTPFork 蜈∬ィア驥崎、逧 SMTP 騾」邱 Configuration_NNTPFork 蜈∬ィア驥崎、逧 NNTP 騾」邱 Configuration_POP3Separator POP3 荳サ讖:騾」謗・蝓:菴ソ逕ィ閠 蛻髫皮ャヲ Configuration_NNTPSeparator NNTP 荳サ讖:騾」謗・蝓:菴ソ逕ィ閠 蛻髫皮ャヲ Configuration_POP3SepUpdate POP3 逧蛻髫皮ャヲ蟾イ譖エ譁ー轤コ %s Configuration_NNTPSepUpdate NNTP 逧蛻髫皮ャヲ蟾イ譖エ譁ー轤コ %s Configuration_UI 菴ソ逕ィ閠莉矩擇邯イ鬆騾」謗・蝓 Configuration_UIUpdate 菴ソ逕ィ閠莉矩擇邯イ鬆騾」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Configuration_History 豈丈ク鬆∵園隕∝怜コ逧驛オ莉カ險頑ッ謨ク驥 Configuration_HistoryUpdate 豈丈ク鬆∵園隕∝怜コ逧驛オ莉カ險頑ッ謨ク驥丞キイ譖エ譁ー轤コ %s Configuration_Days 豁キ蜿イ陬乗園隕∽ソ晉蕗逧螟ゥ謨ク Configuration_DaysUpdate 豁キ蜿イ陬乗園隕∽ソ晉蕗逧螟ゥ謨ク蟾イ譖エ譁ー轤コ %s Configuration_UserInterface 菴ソ逕ィ閠莉矩擇 Configuration_Skins 螟冶ァ讓」蠑 Configuration_SkinsChoose 驕ク謫螟冶ァ讓」蠑 Configuration_Language 隱櫁ィ Configuration_LanguageChoose 驕ク謫隱櫁ィ Configuration_ListenPorts 讓。邨驕ク鬆 Configuration_HistoryView 豁キ蜿イ讙「隕 Configuration_TCPTimeout 騾」邱夐セ譎 Configuration_TCPTimeoutSecs 騾」邱夐セ譎らァ呈丙 Configuration_TCPTimeoutUpdate 騾」邱夐セ譎らァ呈丙蟾イ譖エ譁ー轤コ %s Configuration_ClassificationInsertion 謠貞・驛オ莉カ險頑ッ譁蟄 Configuration_SubjectLine 隶頑峩荳サ譌ィ蛻 Configuration_XTCInsertion 蝨ィ讓咎ュ謠貞・
X-Text-Classification Configuration_XPLInsertion 蝨ィ讓咎ュ謠貞・
X-POPFile-Link Configuration_Logging 譌・隱 Configuration_None 辟。 Configuration_ToScreen 霈ク蜃コ閾ウ陞「蟷 (Console) Configuration_ToFile 霈ク蜃コ閾ウ讙疲。 Configuration_ToScreenFile 霈ク蜃コ閾ウ陞「蟷募所讙疲。 Configuration_LoggerOutput 譌・隱瑚シク蜃コ譁ケ蠑 Configuration_GeneralSkins 螟冶ァ讓」蠑 Configuration_SmallSkins 蟆丞梛螟冶ァ讓」蠑 Configuration_TinySkins 蠕ョ蝙句、冶ァ讓」蠑 Configuration_CurrentLogFile <讙「隕也岼蜑咲噪譌・隱梧ェ> Configuration_SOCKSServer SOCKS V 莉」逅莨コ譛榊勣荳サ讖 Configuration_SOCKSPort SOCKS V 莉」逅莨コ譛榊勣騾」謗・蝓 Configuration_SOCKSPortUpdate SOCKS V 莉」逅莨コ譛榊勣騾」謗・蝓蟾イ譖エ譁ー轤コ %s Configuration_SOCKSServerUpdate SOCKS V 莉」逅莨コ譛榊勣荳サ讖溷キイ譖エ譁ー轤コ %s Configuration_Fields 豁キ蜿イ谺菴 Advanced_Error1 '%s' 蟾イ邯灘惠蠢ス逡・蟄苓ゥ樊ク蝟ョ陬丈コ Advanced_Error2 隕∬「ォ蠢ス逡・逧蟄苓ゥ槫ュ閭ス蛹蜷ォ蟄玲ッ肴丙蟄, ., _, -, 謌 @ 蟄礼ャヲ Advanced_Error3 '%s' 蟾イ陲ォ蜉蜈・蠢ス逡・蟄苓ゥ樊ク蝟ョ陬丈コ Advanced_Error4 '%s' 荳ヲ荳榊惠蠢ス逡・蟄苓ゥ樊ク蝟ョ陬 Advanced_Error5 '%s' 蟾イ蠕槫ソス逡・蟄苓ゥ樊ク蝟ョ陬剰「ォ遘サ髯、莠 Advanced_StopWords 陲ォ蠢ス逡・逧蟄苓ゥ Advanced_Message1 POPFile 譛蠢ス逡・荳句鈴吩コ帛クク逕ィ逧蟄苓ゥ: Advanced_AddWord 蜉蜈・蟄苓ゥ Advanced_RemoveWord 遘サ髯、蟄苓ゥ Advanced_AllParameters 謇譛臥噪 POPFile 蜿謨ク Advanced_Parameter 蜿謨ク Advanced_Value 蛟シ Advanced_Warning 騾呎弍螳梧紛逧 POPFile 蜿謨ク貂蝟ョ. 逾驕ゥ蜷磯イ髫惹スソ逕ィ閠: 螯ウ蜿ッ莉・隶頑峩莉サ菴募純謨ク蛟シ荳ヲ謖我ク 譖エ譁ー; 荳埼℃豐呈怏莉サ菴墓ゥ溷宛譛讙「譟・騾吩コ帛純謨ク蛟シ逧譛画譜諤ァ. 莉・邊鈴ォ秘。ッ遉コ逧鬆逶ョ陦ィ遉コ蟾イ邯灘セ樣占ィュ蛟シ陲ォ蜉莉・隶頑峩莠. 譖エ隧ウ逶。逧驕ク鬆雉險願ォ玖ヲ OptionReference. Advanced_ConfigFile 邨諷区ェ: History_Filter  (逾鬘ッ遉コ %s 驛オ遲) History_FilterBy 驕取ソセ譴昜サカ History_Search  (謖牙ッ莉カ閠/荳サ譌ィ萓謳懷ー %s) History_Title 譛霑醍噪驛オ莉カ險頑ッ History_Jump 霍ウ蛻ー騾吩ク鬆 History_ShowAll 蜈ィ驛ィ鬘ッ遉コ History_ShouldBe 諛芽ゥイ隕∵弍 History_NoFrom 豐呈怏蟇莉カ閠蛻 History_NoSubject 豐呈怏荳サ譌ィ蛻 History_ClassifyAs 蛻鬘樊 History_MagnetUsed 菴ソ逕ィ莠蜷ク髏オ History_MagnetBecause 菴ソ逕ィ莠蜷ク髏オ

陲ォ蛻鬘樊 %s 逧蜴溷屏譏ッ %s 蜷ク髏オ

History_ChangedTo 蟾イ隶頑峩轤コ %s History_Already 驥肴眠蛻鬘樊 %s History_RemoveAll 蜈ィ驛ィ遘サ髯、 History_RemovePage 遘サ髯、譛ャ鬆 History_RemoveChecked 遘サ髯、陲ォ譬ク驕ク逧 History_Remove 謖画ュ、遘サ髯、豁キ蜿イ陬冗噪鬆逶ョ History_SearchMessage 謳懷ー句ッ莉カ閠/荳サ譌ィ History_NoMessages 豐呈怏驛オ莉カ險頑ッ History_ShowMagnet 逕ィ莠蜷ク髏オ History_Negate_Search 雋蜷第頗蟆/驕取ソセ History_Magnet  (逾鬘ッ遉コ逕ア蜷ク髏オ謇蛻鬘樒噪驛オ莉カ險頑ッ) History_NoMagnet  (逾鬘ッ遉コ荳肴弍逕ア蜷ク髏オ謇蛻鬘樒噪驛オ莉カ險頑ッ) History_ResetSearch 驥崎ィュ History_ChangedClass 迴セ蝨ィ陲ォ蛻鬘樒ぜ History_Purge 蜊ウ蛻サ蛻ー譛 History_Increase 蠅槫刈 History_Decrease 貂帛ー History_Column_Characters 隶頑峩蟇莉カ閠, 謾カ莉カ閠, 蜑ッ譛ャ蜥御クサ譌ィ谺菴咲噪蟇ャ蠎ヲ History_Automatic 閾ェ蜍募喧 History_Reclassified 蟾イ驥肴眠蛻鬘 History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title 蟇遒シ Password_Enter 霈ク蜈・蟇遒シ Password_Go 陦! Password_Error1 荳肴ュ」遒コ逧蟇遒シ Security_Error1 騾」謗・蝓荳螳夊ヲ∽サ区名 1 蜥 65535 荵矩俣 Security_Stealth 鬯シ鬯シ逾溽・滓ィ。蠑/莨コ譛榊勣菴懈・ュ Security_NoStealthMode 蜷ヲ (鬯シ鬯シ逾溽・滓ィ。蠑) Security_StealthMode (鬯シ鬯シ逾溽・滓ィ。蠑) Security_ExplainStats (騾吝矩∈鬆髢句福蠕, POPFile 豈丞、ゥ驛ス譛蛯ウ騾∽ク谺。荳句嶺ク牙区丙蛟シ蛻ー getpopfile.org 逧荳蛟玖ウ譛ャ: bc (螯ウ逧驛オ遲呈丙驥), mc (陲ォ POPFile 蛻鬘樣℃逧驛オ莉カ險頑ッ邵ス謨ク) 蜥 ec (蛻鬘樣険隱、逧邵ス謨ク). 騾吩コ帶丙蛟シ譛陲ォ蜆イ蟄伜芦荳蛟区ェ疲。郁」, 辟カ蠕梧怎陲ォ謌醍畑萓逋シ菴井ク莠幃梨譁シ莠コ蛟台スソ逕ィ POPFile 逧諠豕∬キ溷カ謌先譜逧邨ア險郁ウ譁. 謌醍噪邯イ鬆∽シコ譛榊勣譛菫晉蕗蜈カ譛ャ霄ォ逧譌・隱梧ェ皮エ 5 螟ゥ, 辟カ蠕悟ーア譛蜉莉・蛻ェ髯、; 謌台ク肴怎蜆イ蟄倅ササ菴慕オア險郁蝟ョ迯ィ IP 蝨ー蝮髢鍋噪髣懆ッ諤ァ襍キ萓.) Security_ExplainUpdate (騾吝矩∈鬆髢句福蠕, POPFile 豈丞、ゥ驛ス譛蛯ウ騾∽ク谺。荳句嶺ク牙区丙蛟シ蛻ー getpopfile.org 逧荳蛟玖ウ譛ャ: ma (螯ウ逧 POPFile 逧荳サ隕∫沿譛ャ邱ィ陌), mi (螯ウ逧 POPFile 逧谺。隕∫沿譛ャ邱ィ陌) 蜥 bn (螯ウ逧 POPFile 逧蟒コ陌). 譁ー迚域耳蜃コ譎, POPFile 譛謾カ蛻ー荳莉ス蝨門ス「蝗樊, 荳ヲ荳秘。ッ遉コ蝨ィ逡ォ髱「鬆らォッ. 謌醍噪邯イ鬆∽シコ譛榊勣譛菫晉蕗蜈カ譛ャ霄ォ逧譌・隱梧ェ皮エ 5 螟ゥ, 辟カ蠕悟ーア譛蜉莉・蛻ェ髯、; 謌台ク肴怎蜆イ蟄倅ササ菴墓峩譁ー讙「譟・闊蝟ョ迯ィ IP 蝨ー蝮髢鍋噪髣懆ッ諤ァ襍キ萓.) Security_PasswordTitle 菴ソ逕ィ閠莉矩擇蟇遒シ Security_Password 蟇遒シ Security_PasswordUpdate 蟇遒シ蟾イ譖エ譁ー Security_AUTHTitle 驕遶ッ莨コ譛榊勣 Security_SecureServer 驕遶ッ POP3 莨コ譛榊勣 (SPA/AUTH 謌也ゥソ騾丞シ丈サ」逅莨コ譛榊勣) Security_SecureServerUpdate 驕遶ッ POP3 莨コ譛榊勣蟾イ譖エ譁ー轤コ %s Security_SecurePort 驕遶ッ POP3 騾」謗・蝓 (SPA/AUTH 謌也ゥソ騾丞シ丈サ」逅莨コ譛榊勣) Security_SecurePortUpdate 驕遶ッ POP3 騾」謗・蝓蟾イ譖エ譁ー轤コ %s Security_SMTPServer SMTP 騾」骼紋シコ譛榊勣 Security_SMTPServerUpdate SMTP 騾」骼紋シコ譛榊勣蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Security_SMTPPort SMTP 騾」骼夜」謗・蝓 Security_SMTPPortUpdate SMTP 騾」骼夜」謗・蝓蟾イ譖エ譁ー轤コ %s; 騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Security_POP3 謗・蜿嶺セ閾ェ驕遶ッ讖溷勣逧 POP3 騾」邱 (髴隕驥肴眠蝠溷虚 POPFile) Security_SMTP 謗・蜿嶺セ閾ェ驕遶ッ讖溷勣逧 SMTP 騾」邱 (髴隕驥肴眠蝠溷虚 POPFile) Security_NNTP 謗・蜿嶺セ閾ェ驕遶ッ讖溷勣逧 NNTP 騾」邱 (髴隕驥肴眠蝠溷虚 POPFile) Security_UI 謗・蜿嶺セ閾ェ驕遶ッ讖溷勣逧 HTTP (菴ソ逕ィ閠莉矩擇) 騾」邱 (髴隕驥肴眠蝠溷虚 POPFile) Security_XMLRPC 謗・蜿嶺セ閾ェ驕遶ッ讖溷勣逧 XML-RPC 騾」邱 (髴隕驥肴眠蝠溷虚 POPFile) Security_UpdateTitle 閾ェ蜍墓峩譁ー讙「譟・ Security_Update 豈丞、ゥ讙「譟・ POPFile 譏ッ蜷ヲ譛画峩譁ー Security_StatsTitle 蝗槫ア邨ア險郁ウ譁 Security_Stats 豈乗律騾∝コ邨ア險郁ウ譁 Magnet_Error1 '%s' 蜷ク髏オ蟾イ邯灘ュ伜惠譁シ '%s' 驛オ遲定」丈コ Magnet_Error2 譁ー逧 '%s' 蜷ク髏オ霍滓里譛臥噪 '%s' 蜷ク髏オ襍キ莠陦晉ェ, 蜿ッ閭ス譛蠑戊オキ '%s' 驛オ遲貞ァ逧豁ァ逡ー邨先棡. 譁ー逧蜷ク髏オ荳肴怎陲ォ蜉騾イ蜴サ. Magnet_Error3 蟒コ遶区眠逧蜷ク髏オ '%s' 譁シ '%s' 驛オ遲剃クュ Magnet_CurrentMagnets 迴セ逕ィ逧蜷ク髏オ Magnet_Message1 荳句礼噪蜷ク髏オ譛隶謎ソ。莉カ邵ス譏ッ陲ォ蛻鬘槫芦迚ケ螳夂噪驛オ遲定」. Magnet_CreateNew 蟒コ遶区眠逧蜷ク髏オ Magnet_Explanation 譛蛾吩コ幃。槫挨逧蜷ク髏オ蜿ッ莉・逕ィ:
  • 蟇莉カ閠蝨ー蝮謌門錐蟄: 闊我セ倶セ隱ェ: john@company.com 蟆ア逾譛蜷サ蜷育音螳夂噪蝨ー蝮,
    company.com 譛蜷サ蜷亥芦莉サ菴募セ company.com 蟇蜃コ萓逧莠コ,
    John Doe 譛蜷サ蜷育音螳夂噪莠コ, John 譛蜷サ蜷域園譛臥噪 Johns
  • 謾カ莉カ閠/蜑ッ譛ャ蝨ー蝮謌門錐遞ア: 蟆ア霍溷ッ莉カ閠荳讓」: 菴譏ッ蜷ク髏オ逾譛驥晏ー埼Ψ莉カ險頑ッ陬冗噪 To:/Cc: 蝨ー蝮逕滓譜
  • 荳サ譌ィ蟄苓ゥ: 萓句ヲ: hello 譛蜷サ蜷域園譛我クサ譌ィ陬乗怏 hello 逧驛オ莉カ險頑ッ
Magnet_MagnetType 蜷ク髏オ鬘槫挨 Magnet_Value 蛟シ Magnet_Always 邵ス譏ッ蛻蛻ー驛オ遲 Magnet_Jump 霍ウ蛻ー蜷ク髏オ鬆髱「 Bucket_Error1 驛オ遲貞錐遞ア逾閭ス蜷ォ譛牙ー丞ッォ a 蛻ー z 逧蟄玲ッ, 0 蛻ー 9 逧謨ク蟄, 蜉荳 - 蜥 _ Bucket_Error2 蟾イ邯捺怏蜷咲ぜ %s 逧驛オ遲剃コ Bucket_Error3 蟾イ邯灘サコ遶倶コ蜷咲ぜ %s 逧驛オ遲 Bucket_Error4 隲玖シク蜈・髱樒ゥコ逋ス逧蟄苓ゥ Bucket_Error5 蟾イ邯捺滑 %s 驛オ遲呈隼蜷咲ぜ %s 莠 Bucket_Error6 蟾イ邯灘穐髯、莠 %s 驛オ遲剃コ Bucket_Title 驛オ遲堤オ諷 Bucket_BucketName 驛オ遲貞錐遞ア Bucket_WordCount 蟄苓ゥ櫁ィ域丙 Bucket_WordCounts 蟄苓ゥ樊丙逶ョ邨ア險 Bucket_UniqueWords 迯ィ迚ケ逧
蟄苓ゥ樊丙 Bucket_SubjectModification 菫ョ謾ケ荳サ譌ィ讓咎ュ Bucket_ChangeColor 驛オ遲帝。剰牡 Bucket_NotEnoughData 雉譁吩ク崎カウ Bucket_ClassificationAccuracy 蛻鬘樊コ也「コ蠎ヲ Bucket_EmailsClassified 蟾イ蛻鬘樒噪驛オ莉カ險頑ッ謨ク驥 Bucket_EmailsClassifiedUpper 驛オ莉カ險頑ッ蛻鬘樒オ先棡 Bucket_ClassificationErrors 蛻鬘樣険隱、 Bucket_Accuracy 貅也「コ蠎ヲ Bucket_ClassificationCount 蛻鬘櫁ィ域丙 Bucket_ClassificationFP 蛛ス髯ス諤ァ蛻鬘 Bucket_ClassificationFN 蛛ス髯ー諤ァ蛻鬘 Bucket_ResetStatistics 驥崎ィュ邨ア險郁ウ譁 Bucket_LastReset 蜑肴ャ。驥崎ィュ譁シ Bucket_CurrentColor %s 迴セ逕ィ逧鬘剰牡轤コ %s Bucket_SetColorTo 險ュ螳 %s 逧鬘剰牡轤コ %s Bucket_Maintenance 邯ュ隴キ Bucket_CreateBucket 逕ィ騾吝句錐蟄怜サコ遶矩Ψ遲 Bucket_DeleteBucket 蛻ェ謗画ュ、蜷咲ィア逧驛オ遲 Bucket_RenameBucket 譖エ謾ケ豁、蜷咲ィア逧驛オ遲 Bucket_Lookup 譟・謇セ Bucket_LookupMessage 蝨ィ驛オ遲定」乗衍謇セ蟄苓ゥ Bucket_LookupMessage2 譟・謇セ豁、蟄苓ゥ樒噪邨先棡 Bucket_LookupMostLikely %s 譛蜒乗弍蝨ィ %s 譛蜃コ迴セ逧蝟ョ隧 Bucket_DoesNotAppear

%s 荳ヲ譛ェ蜃コ迴セ譁シ莉サ菴暮Ψ遲定」 Bucket_DisabledGlobally 蟾イ蜈ィ蝓溷●逕ィ逧 Bucket_To 閾ウ Bucket_Quarantine 髫秘屬驛オ遲 SingleBucket_Title %s 逧隧ウ邏ー雉譁 SingleBucket_WordCount 驛オ遲貞ュ苓ゥ櫁ィ域丙 SingleBucket_TotalWordCount 蜈ィ驛ィ逧蟄苓ゥ櫁ィ域丙 SingleBucket_Percentage 菴泌ィ驛ィ逧逋セ蛻豈 SingleBucket_WordTable %s 逧蟄苓ゥ櫁。ィ SingleBucket_Message1 謖我ク狗エ「蠑戊」冗噪蟄玲ッ堺セ逵狗恚謇譛我サ・隧イ蟄玲ッ埼幕鬆ュ逧蟄苓ゥ. 謖我ク倶ササ菴募ュ苓ゥ槫ーア蜿ッ莉・譟・謇セ螳蝨ィ謇譛蛾Ψ遲定」冗噪蜿ッ閭ス諤ァ. SingleBucket_Unique %s 迯ィ譛臥噪 SingleBucket_ClearBucket 遘サ髯、謇譛臥噪蟄苓ゥ Session_Title POPFile 髫取ョオ譎よ悄蟾イ騾セ譎 Session_Error 螯ウ逧 POPFile 髫取ョオ譎よ悄蟾イ邯馴セ譛滉コ. 騾吝庄閭ス譏ッ蝗轤コ螯ウ蝠溷虚荳ヲ蛛懈ュ「莠 POPFile 菴蜊サ菫晄戟邯イ鬆∫剰ヲス蝎ィ髢句福謇閾エ. 隲区潔荳句礼噪髀育オ蝉ケ倶ク萓郢シ郤御スソ逕ィ POPFile. View_Title 蝟ョ荳驛オ莉カ險頑ッ讙「隕 View_ShowFrequencies 鬘ッ遉コ蟄苓ゥ樣サ邇 View_ShowProbabilities 鬘ッ遉コ蟄苓ゥ槫庄閭ス諤ァ View_ShowScores 鬘ッ遉コ蟄苓ゥ槫セ怜蜿雁愛螳壼恂陦ィ View_WordMatrix 蟄苓ゥ樒洸髯」 View_WordProbabilities 豁」蝨ィ鬘ッ遉コ蟄苓ゥ槫庄閭ス諤ァ View_WordFrequencies 豁」蝨ィ鬘ッ遉コ蟄苓ゥ樣サ邇 View_WordScores 豁」蝨ィ鬘ッ遉コ蟄苓ゥ槫セ怜 View_Chart 蛻、螳壼恂陦ィ View_DownloadMessage 荳玖シ蛾Ψ莉カ險頑ッ Windows_TrayIcon 譏ッ蜷ヲ隕∝惠 Windows 逧邉サ邨ア蟶ク鬧仙鈴。ッ遉コ POPFile 蝨也、コ? Windows_Console 譏ッ蜷ヲ隕∝惠蜻ス莉、蛻苓ヲ也ェ苓」丞濤陦 POPFile? Windows_NextTime

騾咎譖エ蜍募惠螯ウ驥肴眠蝠溷虚 POPFile 蜑埼ス荳肴怎逕滓譜 Header_MenuSummary 騾吝玖。ィ譬シ譏ッ莉ス蟆手ヲス驕ク蝟ョ, 閭ス隶灘ヲウ蟄伜叙謗ァ蛻カ荳ュ蠢陬丈ク榊酔逧豈丈ク蛟矩髱「. History_MainTableSummary 騾吩サス陦ィ譬シ蛻怜コ莠譛霑第噺蛻ー逧驛オ莉カ險頑ッ逧蟇莉カ閠蜿贋クサ譌ィ, 螯ウ荵溯ス蝨ィ豁、驥肴眠蜉莉・讙「隕紋クヲ驥肴眠蛻鬘樣吩コ幃Ψ莉カ險頑ッ. 謖我ク荳倶クサ譌ィ蛻怜ーア譛鬘ッ遉コ蜃コ螳梧紛逧驛オ莉カ險頑ッ譁蟄, 莉・蜿雁・ケ蛟醍ぜ菴墓怎陲ォ螯よュ、蛻鬘樒噪雉險. 螯ウ蜿ッ莉・蝨ィ '諛芽ゥイ隕∵弍' 谺菴肴欠螳夐Ψ莉カ險頑ッ隧イ豁ク螻ャ逧驛オ遲, 謌冶驍蜴滄咎隶頑峩. 螯よ棡譛臥音螳夂噪驛オ莉カ險頑ッ蜀堺ケ滉ク埼怙隕∽コ, 螯ウ荵溷庄莉・逕ィ '蛻ェ髯、' 谺菴堺セ蠕樊ュキ蜿イ陬丞刈莉・蛻ェ髯、. History_OpenMessageSummary 騾吝玖。ィ譬シ蜷ォ譛画汾蛟矩Ψ莉カ險頑ッ逧蜈ィ譁, 蜈カ荳ュ陲ォ鬮倅コョ蠎ヲ讓咏、コ逧蟄苓ゥ樊弍陲ォ逕ィ萓蛻鬘樒噪, 萓晄答逧譏ッ螂ケ蛟題キ滄ぅ蛟矩Ψ遲呈怙譛蛾梨閨ッ. Bucket_MainTableSummary 騾吝玖。ィ譬シ謠蝉セ帑コ蛻鬘樣Ψ遲堤噪讎よウ. 豈丈ク蛻鈴ス譛鬘ッ遉コ蜃コ驛オ遲貞錐遞ア, 隧イ驛オ遲定」冗噪蟄苓ゥ樒クス謨ク, 豈丞矩Ψ遲定」丞ッヲ髫帷噪蝟ョ迯ィ蟄苓ゥ樊丙驥, 驛オ莉カ險頑ッ逧荳サ譌ィ蛻玲弍蜷ヲ譛蝨ィ陲ォ蛻鬘槫芦隧イ驛オ遲呈凾荳菴オ陲ォ菫ョ謾ケ, 譏ッ蜷ヲ隕髫秘屬陲ォ謾カ騾イ隧イ驛オ遲定」冗噪驛オ莉カ險頑ッ, 莉・蜿贋ク蛟玖ョ灘ヲウ謖鷹∈鬘剰牡逧陦ィ譬シ, 騾吝矩。剰牡譛蝨ィ謗ァ蛻カ荳ュ蠢陬城。ッ遉コ譁シ莉サ菴戊キ溯ゥイ驛オ遲呈怏髣懃噪蝨ー譁ケ. Bucket_StatisticsTableSummary 騾吝玖。ィ譬シ謠蝉セ帑コ荳臥オ霍 POPFile 謨エ鬮疲譜閭ス譛蛾梨逧邨ア險郁ウ譁. 隨ャ荳邨譏ッ蜈カ蛻鬘樊コ也「コ蠎ヲ螯ゆス, 隨ャ莠檎オ譏ッ蜈ア譛牙、壼ー鷹Ψ莉カ險頑ッ陲ォ蜉莉・蛻鬘槫芦驍」蛟矩Ψ遲定」, 隨ャ荳臥オ譏ッ豈丞矩Ψ遲定」乗怏螟壼ー大ュ苓ゥ槫所蜈カ髣懆ッ逋セ蛻豈. Bucket_MaintenanceTableSummary 騾吝玖。ィ譬シ蜷ォ譛我ク蛟玖。ィ蝟ョ, 隶灘ヲウ閭ス螟蟒コ遶, 蛻ェ髯、, 謌夜肴眠蜻ス蜷肴汾蛟矩Ψ遲, 荵溷庄莉・蝨ィ謇譛臥噪驛オ遲定」乗衍謇セ譟仙句ュ苓ゥ, 逵狗恚蜈カ髣懆ッ蜿ッ閭ス諤ァ. Bucket_AccuracyChartSummary 騾吝玖。ィ譬シ逕ィ蝨門ス「鬘ッ遉コ莠驛オ莉カ險頑ッ蛻鬘樒噪貅也「コ蠎ヲ. Bucket_BarChartSummary 騾吝玖。ィ譬シ逕ィ蝨門ス「鬘ッ遉コ莠荳榊酔驛オ遲呈園菴疲答逧逋セ蛻豈. 騾吝酔譎りィ育ョ嶺コ陲ォ蛻鬘樒噪驛オ莉カ險頑ッ謨ク驥, 莉・蜿雁ィ驛ィ逧蟄苓ゥ櫁ィ域丙. Bucket_LookupResultsSummary 騾吝玖。ィ譬シ鬘ッ遉コ莠闊螻埼ォ碑」丈ササ菴慕オヲ螳壼ュ苓ゥ樣梨閨ッ逧蜿ッ閭ス諤ァ. 蟆肴名豈丞矩Ψ遲剃セ隱ェ, 螂ケ驛ス譛鬘ッ遉コ蜃コ隧イ蟄苓ゥ樒匸逕溽噪鬆サ邇, 蟄苓ゥ樊怎蜃コ迴セ蝨ィ隧イ驛オ遲定」冗噪蜿ッ閭ス諤ァ, 莉・蜿顔文隧イ蟄苓ゥ槫コ迴セ蝨ィ驛オ莉カ險頑ッ陬乗凾, 蟆肴名隧イ驛オ遲貞セ怜逧謨エ鬮泌スア髻ソ. Bucket_WordListTableSummary 騾吝玖。ィ譬シ謠蝉セ帑コ迚ケ螳夐Ψ遲定」丞ィ驛ィ逧蟄苓ゥ樊ク蝟ョ, 謖臥ァ髢矩ュ逧蟄玲ッ埼仙玲紛逅. Magnet_MainTableSummary 騾吝玖。ィ譬シ鬘ッ遉コ莠蜷ク髏オ貂蝟ョ, 騾吩コ帛精髏オ譏ッ逕ィ萓謖臥ァ蝗コ螳夊ヲ丞援謚企Ψ莉カ險頑ッ蜉莉・蛻鬘樒噪. 豈丈ク蛻鈴ス譛鬘ッ遉コ蜃コ蜷ク髏オ螯ゆス戊「ォ螳夂セゥ闡, 蜈カ謇隕ャ隕ヲ逧驛オ遲, 驍譛臥畑萓蛻ェ髯、隧イ蜷ク髏オ逧謖蛾. Configuration_MainTableSummary 騾吝玖。ィ譬シ蜷ォ譛画丙蛟玖。ィ蝟ョ, 隶灘ヲウ謗ァ蛻カ POPFile 逧邨諷. Configuration_InsertionTableSummary 騾吝玖。ィ譬シ蜷ォ譛我ク莠帶潔驤, 蛻、譁キ譏ッ蜷ヲ隕∝惠驛オ莉カ險頑ッ驕樣∫オヲ驛オ莉カ逕ィ謌カ遶ッ遞句シ丞燕, 蜈郁。御ソョ謾ケ讓咎ュ謌紋クサ譌ィ蛻. Security_MainTableSummary 騾吝玖。ィ譬シ謠蝉セ帑コ蟷セ邨謗ァ蛻カ, 閭ス蠖ア髻ソ POPFile 謨エ鬮皮オ諷狗噪螳牙ィ, 譏ッ蜷ヲ隕∬ェ蜍墓ェ「譟・遞句シ乗峩譁ー, 莉・蜿頑弍蜷ヲ隕∵滑 POPFile 謨郁ス邨ア險郁ウ譁咏噪荳闊ャ雉險雁さ蝗樒ィ句シ丈ス懆逧荳ュ螟ョ雉譁吝コォ. Advanced_MainTableSummary 騾吝玖。ィ譬シ謠蝉セ帑コ荳莉ス POPFile 蛻鬘樣Ψ莉カ險頑ッ譎よ園譛蠢ス逡・逧蟄苓ゥ樊ク蝟ョ, 蝗轤コ莉門大惠荳闊ャ驛オ莉カ險頑ッ陬冗噪髣懆ッ驕取名鬆サ郢. 螂ケ蛟第怎陲ォ謖臥ァ蟄苓ゥ樣幕鬆ュ逧蟄礼幅陲ォ騾仙玲紛逅. Imap_Bucket2Folder '%s' 驛オ遲堤噪菫。莉カ閾ウ驛オ莉カ蛹」 Imap_MapError 螯ウ荳崎ス謚願カ驕惹ク蛟狗噪驛オ遲貞ー肴牙芦蝟ョ荳逧驛オ莉カ蛹」陬! Imap_Server IMAP 莨コ譛榊勣荳サ讖溷錐遞ア: Imap_ServerNameError 隲玖シク蜈・莨コ譛榊勣逧荳サ讖溷錐遞ア! Imap_Port IMAP 莨コ譛榊勣騾」謗・蝓: Imap_PortError 隲玖シク蜈・譛画譜逧騾」謗・蝓陌溽「シ! Imap_Login IMAP 蟶ウ陌溽匳蜈・: Imap_LoginError 隲玖シク蜈・菴ソ逕ィ閠/逋サ蜈・蜷咲ィア! Imap_Password IMAP 蟶ウ陌溽噪蟇遒シ: Imap_PasswordError 隲玖シク蜈・隕∫畑譁シ莨コ譛榊勣逧蟇遒シ! Imap_Expunge 蠕櫁「ォ逶」隕也噪菫。莉カ蛹」陬乗ク髯、蟾イ陲ォ蛻ェ髯、逧驛オ莉カ險頑ッ. Imap_Interval 譖エ譁ー髢馴囈遘呈丙: Imap_IntervalError 隲玖シク蜈・莉区名 10 遘定ウ 3600 遘帝俣逧髢馴囈. Imap_Bytelimit 豈丞ー驛オ莉カ險頑ッ隕∫畑萓蛻鬘樒噪菴榊邨謨ク. 霈ク蜈・ 0 (遨コ) 陦ィ遉コ螳梧紛逧驛オ莉カ險頑ッ: Imap_BytelimitError 隲玖シク蜈・謨ク蛟シ. Imap_RefreshFolders 驥肴眠謨エ逅驛オ莉カ蛹」貂蝟ョ Imap_Now 迴セ蝨ィ! Imap_UpdateError1 辟。豕慕匳蜈・. 隲矩ゥ苓ュ牙ヲウ逧逋サ蜈・蜷咲ィア霍溷ッ遒シ. Imap_UpdateError2 騾」謗・閾ウ莨コ譛榊勣螟ア謨. 隲区ェ「譟・荳サ讖溷錐遞ア霍滄」謗・蝓, 荳ヲ隲狗「コ隱榊ヲウ豁」蝨ィ邱壻ク. Imap_UpdateError3 隲句育オ諷矩」邱夂エー遽. Imap_NoConnectionMessage 隲句育オ諷矩」邱夂エー遽. 逡カ螯ウ螳梧仙セ, 騾吩ク鬆∬」丞ーア譛蜃コ迴セ譖エ螟壼庄逕ィ逧驕ク鬆. Imap_WatchMore 陲ォ逶」隕夜Ψ莉カ蛹」貂蝟ョ逧驛オ莉カ蛹」 Imap_WatchedFolder 陲ォ逶」隕也噪驛オ莉カ蛹」邱ィ陌 Imap_Use_SSL 菴ソ逕ィ SSL Shutdown_Message POPFile 蟾イ邯楢「ォ蛛懈脂莠 Help_Training 逡カ螯ウ蛻晄ャ。菴ソ逕ィ POPFile 譎, 螂ケ蝠・荵滉ク肴り碁怙隕∬「ォ蜉莉・隱ソ謨. POPFile 逧豈丈ク蛟矩Ψ遲帝ス髴隕∫畑驛オ莉カ險頑ッ萓蜉莉・隱ソ謨, 逾譛臥文螯ウ驥肴眠謚頑汾蛟玖「ォ POPFile 骭ッ隱、蛻鬘樒噪驛オ莉カ險頑ッ驥肴眠蛻鬘槫芦豁」遒コ逧驛オ遲呈凾, 郤皮悄逧譏ッ蝨ィ隱ソ謨吝・ケ. 蜷梧凾螯ウ荵溷セ苓ィュ螳壼ヲウ逧驛オ莉カ逕ィ謌カ遶ッ遞句シ, 萓謖臥ァ POPFile 逧蛻鬘樒オ先棡蜉莉・驕取ソセ驛オ莉カ險頑ッ. 髣懈名險ュ螳夂畑謌カ遶ッ驕取ソセ蝎ィ逧雉險雁庄莉・蝨ィ POPFile 譁莉カ險育吻陬剰「ォ謇セ蛻ー. Help_Bucket_Setup POPFile 髯、莠 "譛ェ蛻鬘 (unclassified)" 逧蛛驛オ遲貞、, 驍髴隕∬ウ蟆大ゥ蛟矩Ψ遲. 閠 POPFile 逧迯ィ迚ケ荵玖剳豁」蝨ィ譁シ螂ケ蟆埼崕蟄宣Ψ莉カ逧蜊蛻譖エ蜍晄名豁、, 螯ウ逕夊ウ蜿ッ莉・譛我ササ諢乗丙驥冗噪驛オ遲. 邁。蝟ョ逧險ュ螳壽怎譏ッ蜒 "蝙蝨セ (spam)", "蛟倶ココ (personal)", 蜥 "蟾・菴 (work)" 驛オ遲. Help_No_More 蛻・蜀埼。ッ遉コ騾吝玖ェェ譏惹コ popfile-1.1.3+dfsg/languages/Chinese-Traditional-BIG5.msg0000664000175000017500000005773411624177330022361 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # POPFile 1.0.0 Traditional Chinese Translation # Created By Jedi Lin, 2004/09/19 # Modified By Jedi Lin, 2007/12/25 # Identify the language and character set used for the interface LanguageCode tw LanguageCharset BIG5 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage zh-tw # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply ョM・ホ ApplyChanges ョM・ホナワァ On カ} Off テ TurnOn ・エカ} TurnOff テ、W Add ・[、J Remove イセー」 Previous ォe、@ュカ Next 、U、@ュカ From アH・ェフ Subject ・Dヲョ Cc ーニ・サ Classification カlオゥ Reclassify ュォキs、タテ Probability ・iッ爻ハ Scores 、タシニ QuickMagnets ァヨウtァlナK Undo チルュ Close テウャ Find エMァ Filter ケLツoセケ Yes ャO No ァ_ ChangeToYes ァヲィャO ChangeToNo ァヲィァ_ Bucket カlオゥ Magnet ァlナK Delete ァRー」 Create ォリ・゚ To ヲャ・、H Total ・ウ。 Rename ァヲW Frequency タWイv Probability ・iッ爻ハ Score 、タシニ Lookup ャdァ Word ヲrオ Count ュpシニ Update ァキs Refresh ュォキsセ羇z FAQ ア`ィ」ーンオェカー ID ID Date 、魘チ Arrived ヲャ・ョノカ。 Size 、j、p # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %m/%d %T %z | %A %Y/%m/%d %T %z # The header and footer that appear on every UI page Header_Title POPFile アアィ、、、゚ Header_Shutdown ーアアシ POPFile Header_History セ・v Header_Buckets カlオゥ Header_Configuration イユコA Header_Advanced カiカ・ Header_Security ヲw・ Header_Magnets ァlナK Footer_HomePage POPFile ュコュカ Footer_Manual 、筵U Footer_Forums ーQスラーマ Footer_FeedMe ョスァU Footer_RequestFeature ・\ッ狄ミィD Footer_MailingList カlサシスラテD Footer_Wiki 、螂カー Configuration_Error1 、タケjイナャ魃牀Oウ讀@ェコヲrイナ Configuration_Error2 ィマ・ホェフ、カュアェコウsアオー、@ゥwュn、カゥ 1 ゥM 65535 、ァカ。 Configuration_Error3 POP3 イ簀・ウsアオー、@ゥwュn、カゥ 1 ゥM 65535 、ァカ。 Configuration_Error4 ュカュア、j、p、@ゥwュn、カゥ 1 ゥM 1000 、ァカ。 Configuration_Error5 セ・vリュnォOッdェコ、鮠ニ、@ゥwュn、カゥ 1 ゥM 366 、ァカ。 Configuration_Error6 TCP ケOョノュネ、@ゥwュn、カゥ 10 ゥM 1800 、ァカ。 Configuration_Error7 XML RPC イ簀・ウsアオー、@ゥwュn、カゥ 1 ゥM 65535 、ァカ。 Configuration_Error8 SOCKS V ・NイzヲェAセケウsアオー、@ゥwュn、カゥ 1 ゥM 65535 、ァカ。 Configuration_POP3Port POP3 イ簀・ウsアオー Configuration_POP3Update POP3 ウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Configuration_XMLRPCUpdate XML-RPC ウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Configuration_XMLRPCPort XML-RPC イ簀・ウsアオー Configuration_SMTPPort SMTP イ簀・ウsアオー Configuration_SMTPUpdate SMTP ウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Configuration_NNTPPort NNTP イ簀・ウsアオー Configuration_NNTPUpdate NNTP ウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Configuration_POPFork 、ケウ\ュォスニェコ POP3 ウsスu Configuration_SMTPFork 、ケウ\ュォスニェコ SMTP ウsスu Configuration_NNTPFork 、ケウ\ュォスニェコ NNTP ウsスu Configuration_POP3Separator POP3 ・Dセ:ウsアオー:ィマ・ホェフ 、タケjイナ Configuration_NNTPSeparator NNTP ・Dセ:ウsアオー:ィマ・ホェフ 、タケjイナ Configuration_POP3SepUpdate POP3 ェコ、タケjイナ、wァキsャー %s Configuration_NNTPSepUpdate NNTP ェコ、タケjイナ、wァキsャー %s Configuration_UI ィマ・ホェフ、カュアコュカウsアオー Configuration_UIUpdate ィマ・ホェフ、カュアコュカウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Configuration_History ィC、@ュカゥメュnヲC・Xェコカl・ーTョァシニカq Configuration_HistoryUpdate ィC、@ュカゥメュnヲC・Xェコカl・ーTョァシニカq、wァキsャー %s Configuration_Days セ・vリゥメュnォOッdェコ、ムシニ Configuration_DaysUpdate セ・vリゥメュnォOッdェコ、ムシニ、wァキsャー %s Configuration_UserInterface ィマ・ホェフ、カュア Configuration_Skins ・~ニ[シヒヲ。 Configuration_SkinsChoose ソセワ・~ニ[シヒヲ。 Configuration_Language サyィ・ Configuration_LanguageChoose ソセワサyィ・ Configuration_ListenPorts シメイユソカオ Configuration_HistoryView セ・vタヒオ Configuration_TCPTimeout ウsスuケOョノ Configuration_TCPTimeoutSecs ウsスuケOョノャシニ Configuration_TCPTimeoutUpdate ウsスuケOョノャシニ、wァキsャー %s Configuration_ClassificationInsertion エ。、Jカl・ーTョァ、螯r Configuration_SubjectLine ナワァ・DヲョヲC Configuration_XTCInsertion ヲbシミタYエ。、J
X-Text-Classification Configuration_XPLInsertion ヲbシミタYエ。、J
X-POPFile-Link Configuration_Logging 、鮟x Configuration_None オL Configuration_ToScreen ソ鬣Xヲワソテケ (Console) Configuration_ToFile ソ鬣Xヲワタノョラ Configuration_ToScreenFile ソ鬣Xヲワソテケ、ホタノョラ Configuration_LoggerOutput 、鮟xソ鬣X、隕。 Configuration_GeneralSkins ・~ニ[シヒヲ。 Configuration_SmallSkins 、pォャ・~ニ[シヒヲ。 Configuration_TinySkins キLォャ・~ニ[シヒヲ。 Configuration_CurrentLogFile <タヒオ・リォeェコ、鮟xタノ> Configuration_SOCKSServer SOCKS V ・NイzヲェAセケ・Dセ Configuration_SOCKSPort SOCKS V ・NイzヲェAセケウsアオー Configuration_SOCKSPortUpdate SOCKS V ・NイzヲェAセケウsアオー、wァキsャー %s Configuration_SOCKSServerUpdate SOCKS V ・NイzヲェAセケ・Dセ、wァキsャー %s Configuration_Fields セ・vト讎 Advanced_Error1 '%s' 、wクgヲbゥソイ、ヲrオイMウ踵リ、F Advanced_Error2 ュnウQゥソイ、ェコヲrオカネッ爭]ァtヲr・タシニヲr, ., _, -, ゥホ @ ヲrイナ Advanced_Error3 '%s' 、wウQ・[、Jゥソイ、ヲrオイMウ踵リ、F Advanced_Error4 '%s' ィテ、」ヲbゥソイ、ヲrオイMウ踵リ Advanced_Error5 '%s' 、wアqゥソイ、ヲrオイMウ踵リウQイセー」、F Advanced_StopWords ウQゥソイ、ェコヲrオ Advanced_Message1 POPFile キ|ゥソイ、、UヲCウoィヌア`・ホェコヲrオ: Advanced_AddWord ・[、Jヲrオ Advanced_RemoveWord イセー」ヲrオ Advanced_AllParameters ゥメヲウェコ POPFile ームシニ Advanced_Parameter ームシニ Advanced_Value ュネ Advanced_Warning ウoャOァケセ罨コ POPFile ームシニイMウ. ャ鮴AヲXカiカ・ィマ・ホェフ: ゥp・i・Hナワァ・ヲームシニュネィテォ、U ァキs; 、」ケLィSヲウ・ヲセィキ|タヒャdウoィヌームシニュネェコヲウョトゥハ. ・Hイハナ鯒罕ワェコカオ・リェ・ワ、wクgアqケwウ]ュネウQ・[・Hナワァ、F. ァクヤコノェコソカオクーTスミィ」 OptionReference. Advanced_ConfigFile イユコAタノ: History_Filter  (ャ鯒罕ワ %s カlオゥ) History_FilterBy ケLツoア・ History_Search  (ォアH・ェフ/・DヲョィモキjエM %s) History_Title ウフェェコカl・ーTョァ History_Jump クィウo、@ュカ History_ShowAll ・ウ。ナ罕ワ History_ShouldBe タウクモュnャO History_NoFrom ィSヲウアH・ェフヲC History_NoSubject ィSヲウ・DヲョヲC History_ClassifyAs 、タテヲィ History_MagnetUsed ィマ・ホ、FァlナK History_MagnetBecause ィマ・ホ、FァlナK

ウQ、タテヲィ %s ェコュヲ]ャO %s ァlナK

History_ChangedTo 、wナワァャー %s History_Already ュォキs、タテヲィ %s History_RemoveAll ・ウ。イセー」 History_RemovePage イセー」・サュカ History_RemoveChecked イセー」ウQョヨソェコ History_Remove ォヲケイセー」セ・vリェコカオ・リ History_SearchMessage キjエMアH・ェフ/・Dヲョ History_NoMessages ィSヲウカl・ーTョァ History_ShowMagnet ・ホ、FァlナK History_Negate_Search ュtヲVキjエM/ケLツo History_Magnet  (ャ鯒罕ワ・ムァlナKゥメ、タテェコカl・ーTョァ) History_NoMagnet  (ャ鯒罕ワ、」ャO・ムァlナKゥメ、タテェコカl・ーTョァ) History_ResetSearch ュォウ] History_ChangedClass イ{ヲbウQ、タテャー History_Purge ァYィ險エチ History_Increase シW・[ History_Decrease エ、ヨ History_Column_Characters ナワァアH・ェフ, ヲャ・ェフ, ーニ・サゥM・Dヲョト讎ェコシeォラ History_Automatic ヲローハ、ニ History_Reclassified 、wュォキs、タテ History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title アKスX Password_Enter ソ鬢JアKスX Password_Go スト! Password_Error1 、」・ソスTェコアKスX Security_Error1 ウsアオー、@ゥwュn、カゥ 1 ゥM 65535 、ァカ。 Security_Stealth ーューュッゥッゥシメヲ。/ヲェAセケァ@キ~ Security_NoStealthMode ァ_ (ーューュッゥッゥシメヲ。) Security_StealthMode (ーューュッゥッゥシメヲ。) Security_ExplainStats (ウoュモソカオカ}アメォ, POPFile ィC、ムウ」キ|カヌーe、@ヲク、UヲC、Tュモシニュネィ getpopfile.org ェコ、@ュモク}・サ: bc (ゥpェコカlオゥシニカq), mc (ウQ POPFile 、タテケLェコカl・ーTョァチ`シニ) ゥM ec (、タテソサ~ェコチ`シニ). ウoィヌシニュネキ|ウQタxヲsィ、@ュモタノョラリ, オMォ盥|ウQァレ・ホィモオoァG、@ィヌテゥ、Hュフィマ・ホ POPFile ェコア。ェpクィ荐ィョトェコイホュpクョニ. ァレェココュカヲェAセケキ|ォOッdィ茹サィュェコ、鮟xタノャ 5 、ム, オMォ盒Nキ|・[・HァRー」; ァレ、」キ|タxヲs・ヲイホュpサPウ豼W IP ヲaァ}カ。ェコテチpゥハー_ィモ.) Security_ExplainUpdate (ウoュモソカオカ}アメォ, POPFile ィC、ムウ」キ|カヌーe、@ヲク、UヲC、Tュモシニュネィ getpopfile.org ェコ、@ュモク}・サ: ma (ゥpェコ POPFile ェコ・Dュnェゥ・サスsクケ), mi (ゥpェコ POPFile ェコヲクュnェゥ・サスsクケ) ゥM bn (ゥpェコ POPFile ェコォリクケ). キsェゥアタ・Xョノ, POPFile キ|ヲャィ、@・ケマァホヲ^タウ, ィテ・Bナ罕ワヲbオeュアウサコン. ァレェココュカヲェAセケキ|ォOッdィ茹サィュェコ、鮟xタノャ 5 、ム, オMォ盒Nキ|・[・HァRー」; ァレ、」キ|タxヲs・ヲァキsタヒャdサPウ豼W IP ヲaァ}カ。ェコテチpゥハー_ィモ.) Security_PasswordTitle ィマ・ホェフ、カュアアKスX Security_Password アKスX Security_PasswordUpdate アKスX、wァキs Security_AUTHTitle サキコンヲェAセケ Security_SecureServer サキコン POP3 ヲェAセケ (SPA/AUTH ゥホャウzヲ。・NイzヲェAセケ) Security_SecureServerUpdate サキコン POP3 ヲェAセケ、wァキsャー %s Security_SecurePort サキコン POP3 ウsアオー (SPA/AUTH ゥホャウzヲ。・NイzヲェAセケ) Security_SecurePortUpdate サキコン POP3 ウsアオー、wァキsャー %s Security_SMTPServer SMTP ウsツヲェAセケ Security_SMTPServerUpdate SMTP ウsツヲェAセケ、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Security_SMTPPort SMTP ウsツウsアオー Security_SMTPPortUpdate SMTP ウsツウsアオー、wァキsャー %s; ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Security_POP3 アオィィモヲロサキコンセセケェコ POP3 ウsスu (サンュnュォキsアメーハ POPFile) Security_SMTP アオィィモヲロサキコンセセケェコ SMTP ウsスu (サンュnュォキsアメーハ POPFile) Security_NNTP アオィィモヲロサキコンセセケェコ NNTP ウsスu (サンュnュォキsアメーハ POPFile) Security_UI アオィィモヲロサキコンセセケェコ HTTP (ィマ・ホェフ、カュア) ウsスu (サンュnュォキsアメーハ POPFile) Security_XMLRPC アオィィモヲロサキコンセセケェコ XML-RPC ウsスu (サンュnュォキsアメーハ POPFile) Security_UpdateTitle ヲローハァキsタヒャd Security_Update ィC、ムタヒャd POPFile ャOァ_ヲウァキs Security_StatsTitle ヲ^ウイホュpクョニ Security_Stats ィC、魏e・Xイホュpクョニ Magnet_Error1 '%s' ァlナK、wクgヲsヲbゥ '%s' カlオゥリ、F Magnet_Error2 キsェコ '%s' ァlナKクャJヲウェコ '%s' ァlナKー_、Fストャ, ・iッ犢|、゙ー_ '%s' カlオゥ、コェコェ[イァオイェG. キsェコァlナK、」キ|ウQ・[カi・h. Magnet_Error3 ォリ・゚キsェコァlナK '%s' ゥ '%s' カlオゥ、、 Magnet_CurrentMagnets イ{・ホェコァlナK Magnet_Message1 、UヲCェコァlナKキ|ナォH・チ`ャOウQ、タティッSゥwェコカlオゥリ. Magnet_CreateNew ォリ・゚キsェコァlナK Magnet_Explanation ヲウウoィヌテァOェコァlナK・i・H・ホ:
  • アH・ェフヲaァ}ゥホヲWヲr: チ|ィメィモサ。: john@company.com エNャ鮃|ァkヲXッSゥwェコヲaァ},
    company.com キ|ァkヲXィ・ヲアq company.com アH・Xィモェコ、H,
    John Doe キ|ァkヲXッSゥwェコ、H, John キ|ァkヲXゥメヲウェコ Johns
  • ヲャ・ェフ/ーニ・サヲaァ}ゥホヲWコル: エNクアH・ェフ、@シヒ: ヲャOァlナKャ鮃|ーwケカl・ーTョァリェコ To:/Cc: ヲaァ}・ヘョト
  • ・Dヲョヲrオ: ィメヲp: hello キ|ァkヲXゥメヲウ・Dヲョリヲウ hello ェコカl・ーTョァ
Magnet_MagnetType ァlナKテァO Magnet_Value ュネ Magnet_Always チ`ャO、タィカlオゥ Magnet_Jump クィァlナKュカュア Bucket_Error1 カlオゥヲWコルャ魃爰tヲウ、pシg a ィ z ェコヲr・タ, 0 ィ 9 ェコシニヲr, ・[、W - ゥM _ Bucket_Error2 、wクgヲウヲWャー %s ェコカlオゥ、F Bucket_Error3 、wクgォリ・゚、FヲWャー %s ェコカlオゥ Bucket_Error4 スミソ鬢JォDェナ・ユェコヲrオ Bucket_Error5 、wクgァ %s カlオゥァヲWャー %s 、F Bucket_Error6 、wクgァRー」、F %s カlオゥ、F Bucket_Title カlオゥイユコA Bucket_BucketName カlオゥヲWコル Bucket_WordCount ヲrオュpシニ Bucket_WordCounts ヲrオシニ・リイホュp Bucket_UniqueWords ソWッSェコ
ヲrオシニ Bucket_SubjectModification ュラァ・DヲョシミタY Bucket_ChangeColor カlオゥテCヲ Bucket_NotEnoughData クョニ、」ィャ Bucket_ClassificationAccuracy 、タテキヌスTォラ Bucket_EmailsClassified 、w、タテェコカl・ーTョァシニカq Bucket_EmailsClassifiedUpper カl・ーTョァ、タテオイェG Bucket_ClassificationErrors 、タテソサ~ Bucket_Accuracy キヌスTォラ Bucket_ClassificationCount 、タテュpシニ Bucket_ClassificationFP ーーカァゥハ、タテ Bucket_ClassificationFN ーーウアゥハ、タテ Bucket_ResetStatistics ュォウ]イホュpクョニ Bucket_LastReset ォeヲクュォウ]ゥ Bucket_CurrentColor %s イ{・ホェコテCヲ筮ー %s Bucket_SetColorTo ウ]ゥw %s ェコテCヲ筮ー %s Bucket_Maintenance コナ@ Bucket_CreateBucket ・ホウoュモヲWヲrォリ・゚カlオゥ Bucket_DeleteBucket ァRアシヲケヲWコルェコカlオゥ Bucket_RenameBucket ァァヲケヲWコルェコカlオゥ Bucket_Lookup ャdァ Bucket_LookupMessage ヲbカlオゥリャdァ荐rオ Bucket_LookupMessage2 ャdァ荐ケヲrオェコオイェG Bucket_LookupMostLikely %s ウフケウャOヲb %s キ|・Xイ{ェコウ豬 Bucket_DoesNotAppear

%s ィテ・シ・Xイ{ゥ・ヲカlオゥリ Bucket_DisabledGlobally 、w・ーーア・ホェコ Bucket_To ヲワ Bucket_Quarantine ケjツカlオゥ SingleBucket_Title %s ェコクヤイモクョニ SingleBucket_WordCount カlオゥヲrオュpシニ SingleBucket_TotalWordCount ・ウ。ェコヲrオュpシニ SingleBucket_Percentage ヲ・ウ。ェコヲハ、タ、 SingleBucket_WordTable %s ェコヲrオェ SingleBucket_Message1 ォ、Uッチ、゙リェコヲr・タィモャンャンゥメヲウ・Hクモヲr・タカ}タYェコヲrオ. ォ、U・ヲヲrオエN・i・Hャdァ茹ヲヲbゥメヲウカlオゥリェコ・iッ爻ハ. SingleBucket_Unique %s ソWヲウェコ SingleBucket_ClearBucket イセー」ゥメヲウェコヲrオ Session_Title POPFile カ・ャqョノエチ、wケOョノ Session_Error ゥpェコ POPFile カ・ャqョノエチ、wクgケOエチ、F. ウo・iッ牀Oヲ]ャーゥpアメーハィテーア、、F POPFile ヲォoォOォコュカツsトセケカ}アメゥメュP. スミォ、UヲCェコテオイ、ァ、@ィモト~トィマ・ホ POPFile. View_Title ウ讀@カl・ーTョァタヒオ View_ShowFrequencies ナ罕ワヲrオタWイv View_ShowProbabilities ナ罕ワヲrオ・iッ爻ハ View_ShowScores ナ罕ワヲrオアo、タ、ホァPゥwケマェ View_WordMatrix ヲrオッxー} View_WordProbabilities ・ソヲbナ罕ワヲrオ・iッ爻ハ View_WordFrequencies ・ソヲbナ罕ワヲrオタWイv View_WordScores ・ソヲbナ罕ワヲrオアo、タ View_Chart ァPゥwケマェ View_DownloadMessage 、Uクカl・ーTョァ Windows_TrayIcon ャOァ_ュnヲb Windows ェコィtイホア`セnヲCナ罕ワ POPFile ケマ・ワ? Windows_Console ャOァ_ュnヲbゥR・OヲCオオ。リーヲ POPFile? Windows_NextTime

ウoカオァーハヲbゥpュォキsアメーハ POPFile ォeウ」、」キ|・ヘョト Header_MenuSummary ウoュモェョ谺O・セノトソウ, ッ倏ゥpヲsィアアィ、、、゚リ、」ヲPェコィC、@ュモュカュア. History_MainTableSummary ウo・ェョ讎C・X、Fウフェヲャィェコカl・ーTョァェコアH・ェフ、ホ・Dヲョ, ゥp、]ッ爬bヲケュォキs・[・Hタヒオィテュォキs、タテウoィヌカl・ーTョァ. ォ、@、U・DヲョヲCエNキ|ナ罕ワ・Xァケセ罨コカl・ーTョァ、螯r, ・H、ホヲoュフャーヲキ|ウQヲpヲケ、タテェコクーT. ゥp・i・Hヲb 'タウクモュnャO' ト讎ォゥwカl・ーTョァクモツkトンェコカlオゥ, ゥホェフチルュウoカオナワァ. ヲpェGヲウッSゥwェコカl・ーTョァヲA、]、」サンュn、F, ゥp、]・i・H・ホ 'ァRー」' ト讎ィモアqセ・vリ・[・HァRー」. History_OpenMessageSummary ウoュモェョ讒tヲウャYュモカl・ーTョァェコ・、, ィ荀、ウQーェォGォラシミ・ワェコヲrオャOウQ・ホィモ、タテェコ, ィフセレェコャOヲoュフクィコュモカlオゥウフヲウテチp. Bucket_MainTableSummary ウoュモェョ豢」ィム、F、タテカlオゥェコキァェp. ィC、@ヲCウ」キ|ナ罕ワ・XカlオゥヲWコル, クモカlオゥリェコヲrオチ`シニ, ィCュモカlオゥリケサレェコウ豼Wヲrオシニカq, カl・ーTョァェコ・DヲョヲCャOァ_キ|ヲbウQ、タティクモカlオゥョノ、@ィヨウQュラァ, ャOァ_ュnケjツウQヲャカiクモカlオゥリェコカl・ーTョァ, ・H、ホ、@ュモナゥpャDソテCヲ筱コェョ, ウoュモテCヲ箙|ヲbアアィ、、、゚リナ罕ワゥ・ヲククモカlオゥヲウテェコヲa、. Bucket_StatisticsTableSummary ウoュモェョ豢」ィム、F、Tイユク POPFile セ翡魄トッ爬ウテェコイホュpクョニ. イト、@イユャOィ荀タテキヌスTォラヲpヲ, イト、GイユャOヲ@ヲウヲh、ヨカl・ーTョァウQ・[・H、タティィコュモカlオゥリ, イト、TイユャOィCュモカlオゥリヲウヲh、ヨヲrオ、ホィ菘チpヲハ、タ、. Bucket_MaintenanceTableSummary ウoュモェョ讒tヲウ、@ュモェウ, ナゥpッ牴ォリ・゚, ァRー」, ゥホュォキsゥRヲWャYュモカlオゥ, 、]・i・Hヲbゥメヲウェコカlオゥリャdァ莅Yュモヲrオ, ャンャンィ菘チp・iッ爻ハ. Bucket_AccuracyChartSummary ウoュモェョ讌ホケマァホナ罕ワ、Fカl・ーTョァ、タテェコキヌスTォラ. Bucket_BarChartSummary ウoュモェョ讌ホケマァホナ罕ワ、F、」ヲPカlオゥゥメヲセレェコヲハ、タ、. ウoヲPョノュpコ筅FウQ、タテェコカl・ーTョァシニカq, ・H、ホ・ウ。ェコヲrオュpシニ. Bucket_LookupResultsSummary ウoュモェョ貲罕ワ、FサPォヘナ鴿リ・ヲオケゥwヲrオテチpェコ・iッ爻ハ. ケゥィCュモカlオゥィモサ。, ヲoウ」キ|ナ罕ワ・Xクモヲrオオo・ヘェコタWイv, ヲrオキ|・Xイ{ヲbクモカlオゥリェコ・iッ爻ハ, ・H、ホキクモヲrオ・Xイ{ヲbカl・ーTョァリョノ, ケゥクモカlオゥアo、タェコセ翡鮠vナT. Bucket_WordListTableSummary ウoュモェョ豢」ィム、FッSゥwカlオゥリ・ウ。ェコヲrオイMウ, ォキモカ}タYェコヲr・タウvヲCセ羇z. Magnet_MainTableSummary ウoュモェョ貲罕ワ、FァlナKイMウ, ウoィヌァlナKャO・ホィモォキモゥTゥwウWォhァ筝l・ーTョァ・[・H、タテェコ. ィC、@ヲCウ」キ|ナ罕ワ・XァlナKヲpヲウQゥwクqオロ, ィ茫メチサソフェコカlオゥ, チルヲウ・ホィモァRー」クモァlナKェコォカs. Configuration_MainTableSummary ウoュモェョ讒tヲウシニュモェウ, ナゥpアアィ POPFile ェコイユコA. Configuration_InsertionTableSummary ウoュモェョ讒tヲウ、@ィヌォカs, ァPツ_ャOァ_ュnヲbカl・ーTョァサシーeオケカl・・ホ、蘯ンオ{ヲ。ォe, ・ヲ豁ラァシミタYゥホ・DヲョヲC. Security_MainTableSummary ウoュモェョ豢」ィム、FエXイユアアィ, ッ狆vナT POPFile セ翡魎ユコAェコヲw・, ャOァ_ュnヲローハタヒャdオ{ヲ。ァキs, ・H、ホャOァ_ュnァ POPFile ョトッ犂ホュpクョニェコ、@ックーTカヌヲ^オ{ヲ。ァ@ェフェコ、、・。クョニョw. Advanced_MainTableSummary ウoュモェョ豢」ィム、F、@・ POPFile 、タテカl・ーTョァョノゥメキ|ゥソイ、ェコヲrオイMウ, ヲ]ャー・Lュフヲb、@ッカl・ーTョァリェコテチpケLゥタWチc. ヲoュフキ|ウQォキモヲrオカ}タYェコヲrッaウQウvヲCセ羇z. Imap_Bucket2Folder '%s' カlオゥェコォH・ヲワカl・ァX Imap_MapError ゥp、」ッ爰筝WケL、@ュモェコカlオゥケタウィウ讀@ェコカl・ァXリ! Imap_Server IMAP ヲェAセケ・DセヲWコル: Imap_ServerNameError スミソ鬢JヲェAセケェコ・DセヲWコル! Imap_Port IMAP ヲェAセケウsアオー: Imap_PortError スミソ鬢JヲウョトェコウsアオークケスX! Imap_Login IMAP アbクケオn、J: Imap_LoginError スミソ鬢Jィマ・ホェフ/オn、JヲWコル! Imap_Password IMAP アbクケェコアKスX: Imap_PasswordError スミソ鬢Jュn・ホゥヲェAセケェコアKスX! Imap_Expunge アqウQコハオェコォH・ァXリイMー」、wウQァRー」ェコカl・ーTョァ. Imap_Interval ァキsカ。ケjャシニ: Imap_IntervalError スミソ鬢J、カゥ 10 ャヲワ 3600 ャカ。ェコカ。ケj. Imap_Bytelimit ィCォハカl・ーTョァュn・ホィモ、タテェコヲ、クイユシニ. ソ鬢J 0 (ェナ) ェ・ワァケセ罨コカl・ーTョァ: Imap_BytelimitError スミソ鬢Jシニュネ. Imap_RefreshFolders ュォキsセ羇zカl・ァXイMウ Imap_Now イ{ヲb! Imap_UpdateError1 オLェkオn、J. スミナ酖メゥpェコオn、JヲWコルクアKスX. Imap_UpdateError2 ウsアオヲワヲェAセケ・「アム. スミタヒャd・DセヲWコルクウsアオー, ィテスミスTサ{ゥp・ソヲbスu、W. Imap_UpdateError3 スミ・イユコAウsスuイモク`. Imap_NoConnectionMessage スミ・イユコAウsスuイモク`. キゥpァケヲィォ, ウo、@ュカリエNキ|・Xイ{ァヲh・i・ホェコソカオ. Imap_WatchMore ウQコハオカl・ァXイMウ讙コカl・ァX Imap_WatchedFolder ウQコハオェコカl・ァXスsクケ Imap_Use_SSL ィマ・ホ SSL Shutdown_Message POPFile 、wクgウQーアアシ、F Help_Training キゥpェヲクィマ・ホ POPFile ョノ, ヲoヤ」、]、」タエヲモサンュnウQ・[・Hスユアミ. POPFile ェコィC、@ュモカlオゥウ」サンュn・ホカl・ーTョァィモ・[・Hスユアミ, ャ鬥ウキゥpュォキsァ筮YュモウQ POPFile ソサ~、タテェコカl・ーTョァュォキs、タティ・ソスTェコカlオゥョノ, ナラッuェコャOヲbスユアミヲo. ヲPョノゥp、]アoウ]ゥwゥpェコカl・・ホ、蘯ンオ{ヲ。, ィモォキモ POPFile ェコ、タテオイェG・[・HケLツoカl・ーTョァ. テゥウ]ゥw・ホ、蘯ンケLツoセケェコクーT・i・Hヲb POPFile 、螂ュpオeリウQァ茯. Help_Bucket_Setup POPFile ー」、F "・シ、タテ (unclassified)" ェコーイカlオゥ・~, チルサンュnヲワ、ヨィ箝モカlオゥ. ヲモ POPFile ェコソWッS、ァウB・ソヲbゥヲoケケq、lカl・ェコーマ、タァウモゥヲケ, ゥpャニヲワ・i・Hヲウ・キNシニカqェコカlオゥ. ツイウ讙コウ]ゥwキ|ャOケウ "ゥUァ」 (spam)", "ュモ、H (personal)", ゥM "、uァ@ (work)" カlオゥ. Help_No_More ァOヲAナ罕ワウoュモサ。ゥ、F popfile-1.1.3+dfsg/languages/Chinese-Simplified.msg0000664000175000017500000006732011624177330021500 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # POPFile 1.0.0 Simplified Chinese Translation # Created By Jedi Lin, 2004/09/19 # In fact translated from Traditional Chinese by Encode::HanConvert # Modified By Jedi Lin, 2007/12/25 # Identify the language and character set used for the interface LanguageCode cn LanguageCharset UTF8 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage zh-cn # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply 螂礼畑 ApplyChanges 螂礼畑蜿俶峩 On 蠑 Off 蜈ウ TurnOn 謇灘シ TurnOff 蜈ウ荳 Add 蜉蜈・ Remove 遘サ髯、 Previous 蜑堺ク鬘オ Next 荳倶ク鬘オ From 蟇莉カ閠 Subject 荳サ譌ィ Cc 蜑ッ譛ャ Classification 驍ョ遲 Reclassify 驥肴眠蛻邀サ Probability 蜿ッ閭ス諤ァ Scores 蛻謨ー QuickMagnets 蠢ォ騾溷精體 Undo 霑伜次 Close 蜈ウ髣ュ Find 蟇サ謇セ Filter 霑貊、蝎ィ Yes 譏ッ No 蜷ヲ ChangeToYes 謾ケ謌先弍 ChangeToNo 謾ケ謌仙凄 Bucket 驍ョ遲 Magnet 蜷ク體 Delete 蛻髯、 Create 蟒コ遶 To 謾カ莉カ莠コ Total 蜈ィ驛ィ Rename 譖エ蜷 Frequency 鬚醍紫 Probability 蜿ッ閭ス諤ァ Score 蛻謨ー Lookup 譟・謇セ Word 蟄苓ッ Count 隶。謨ー Update 譖エ譁ー Refresh 驥肴眠謨エ逅 FAQ 蟶ク隗髣ョ遲秘寔 ID ID Date 譌・譛 Arrived 謾カ莉カ譌カ髣エ Size 螟ァ蟆 # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %m/%d %T %z | %A %Y/%m/%d %T %z # The header and footer that appear on every UI page Header_Title POPFile 謗ァ蛻カ荳ュ蠢 Header_Shutdown 蛛懈脂 POPFile Header_History 蜴蜿イ Header_Buckets 驍ョ遲 Header_Configuration 扈諤 Header_Advanced 霑幃亳 Header_Security 螳牙ィ Header_Magnets 蜷ク體 Footer_HomePage POPFile 鬥夜。オ Footer_Manual 謇句 Footer_Forums 隶ィ隶コ蛹コ Footer_FeedMe 謐仙勧 Footer_RequestFeature 蜉溯ス隸キ豎 Footer_MailingList 驍ョ騾定ョコ鬚 Footer_Wiki 譁莉カ髮 Configuration_Error1 蛻髫皮ャヲ逾閭ス譏ッ蜊穂ク逧蟄礼ャヲ Configuration_Error2 菴ソ逕ィ閠謗・蜿」逧霑樊磁蝓荳螳夊ヲ∽サ倶コ 1 蜥 65535 荵矩龍 Configuration_Error3 POP3 閨蜷ャ霑樊磁蝓荳螳夊ヲ∽サ倶コ 1 蜥 65535 荵矩龍 Configuration_Error4 鬘オ髱「螟ァ蟆丈ク螳夊ヲ∽サ倶コ 1 蜥 1000 荵矩龍 Configuration_Error5 蜴蜿イ驥瑚ヲ∽ソ晉蕗逧譌・謨ー荳螳夊ヲ∽サ倶コ 1 蜥 366 荵矩龍 Configuration_Error6 TCP 騾セ譌カ蛟シ荳螳夊ヲ∽サ倶コ 10 蜥 1800 荵矩龍 Configuration_Error7 XML RPC 閨蜷ャ霑樊磁蝓荳螳夊ヲ∽サ倶コ 1 蜥 65535 荵矩龍 Configuration_Error8 SOCKS V 莉」逅譛榊苅蝎ィ霑樊磁蝓荳螳夊ヲ∽サ倶コ 1 蜥 65535 荵矩龍 Configuration_POP3Port POP3 閨蜷ャ霑樊磁蝓 Configuration_POP3Update POP3 霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Configuration_XMLRPCUpdate XML-RPC 霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Configuration_XMLRPCPort XML-RPC 閨蜷ャ霑樊磁蝓 Configuration_SMTPPort SMTP 閨蜷ャ霑樊磁蝓 Configuration_SMTPUpdate SMTP 霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Configuration_NNTPPort NNTP 閨蜷ャ霑樊磁蝓 Configuration_NNTPUpdate NNTP 霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Configuration_POPFork 蜈∬ョク驥榊、咲噪 POP3 閨疲惻 Configuration_SMTPFork 蜈∬ョク驥榊、咲噪 SMTP 閨疲惻 Configuration_NNTPFork 蜈∬ョク驥榊、咲噪 NNTP 閨疲惻 Configuration_POP3Separator POP3 荳サ譛コ:霑樊磁蝓:菴ソ逕ィ閠 蛻髫皮ャヲ Configuration_NNTPSeparator NNTP 荳サ譛コ:霑樊磁蝓:菴ソ逕ィ閠 蛻髫皮ャヲ Configuration_POP3SepUpdate POP3 逧蛻髫皮ャヲ蟾イ譖エ譁ー荳コ %s Configuration_NNTPSepUpdate NNTP 逧蛻髫皮ャヲ蟾イ譖エ譁ー荳コ %s Configuration_UI 菴ソ逕ィ閠謗・蜿」鄂鷹。オ霑樊磁蝓 Configuration_UIUpdate 菴ソ逕ィ閠謗・蜿」鄂鷹。オ霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Configuration_History 豈丈ク鬘オ謇隕∝怜コ逧驍ョ莉カ隶ッ諱ッ謨ー驥 Configuration_HistoryUpdate 豈丈ク鬘オ謇隕∝怜コ逧驍ョ莉カ隶ッ諱ッ謨ー驥丞キイ譖エ譁ー荳コ %s Configuration_Days 蜴蜿イ驥梧園隕∽ソ晉蕗逧螟ゥ謨ー Configuration_DaysUpdate 蜴蜿イ驥梧園隕∽ソ晉蕗逧螟ゥ謨ー蟾イ譖エ譁ー荳コ %s Configuration_UserInterface 菴ソ逕ィ閠謗・蜿」 Configuration_Skins 螟冶ァよキ蠑 Configuration_SkinsChoose 騾画叫螟冶ァよキ蠑 Configuration_Language 隸ュ險 Configuration_LanguageChoose 騾画叫隸ュ險 Configuration_ListenPorts 讓。蝮鈴蛾。ケ Configuration_HistoryView 蜴蜿イ譽隗 Configuration_TCPTimeout 閨疲惻騾セ譌カ Configuration_TCPTimeoutSecs 閨疲惻騾セ譌カ遘呈焚 Configuration_TCPTimeoutUpdate 閨疲惻騾セ譌カ遘呈焚蟾イ譖エ譁ー荳コ %s Configuration_ClassificationInsertion 謠貞・驍ョ莉カ隶ッ諱ッ譁蟄 Configuration_SubjectLine 蜿俶峩荳サ譌ィ蛻 Configuration_XTCInsertion 蝨ィ譬螟エ謠貞・
X-Text-Classification Configuration_XPLInsertion 蝨ィ譬螟エ謠貞・
X-POPFile-Link Configuration_Logging 譌・蠢 Configuration_None 譌 Configuration_ToScreen 霎灘コ閾ウ螻丞ケ (Console) Configuration_ToFile 霎灘コ閾ウ譯」譯 Configuration_ToScreenFile 霎灘コ閾ウ螻丞ケ募所譯」譯 Configuration_LoggerOutput 譌・蠢苓セ灘コ譁ケ蠑 Configuration_GeneralSkins 螟冶ァよキ蠑 Configuration_SmallSkins 蟆丞梛螟冶ァよキ蠑 Configuration_TinySkins 蠕ョ蝙句、冶ァよキ蠑 Configuration_CurrentLogFile <譽隗逶ョ蜑咲噪譌・蠢玲。」> Configuration_SOCKSServer SOCKS V 莉」逅譛榊苅蝎ィ荳サ譛コ Configuration_SOCKSPort SOCKS V 莉」逅譛榊苅蝎ィ霑樊磁蝓 Configuration_SOCKSPortUpdate SOCKS V 莉」逅譛榊苅蝎ィ霑樊磁蝓蟾イ譖エ譁ー荳コ %s Configuration_SOCKSServerUpdate SOCKS V 莉」逅譛榊苅蝎ィ荳サ譛コ蟾イ譖エ譁ー荳コ %s Configuration_Fields 蜴蜿イ蟄玲ョオ Advanced_Error1 '%s' 蟾イ扈丞惠蠢ス逡・蟄苓ッ肴ク蜊暮御コ Advanced_Error2 隕∬「ォ蠢ス逡・逧蟄苓ッ堺サ閭ス蛹蜷ォ蟄玲ッ肴焚蟄, ., _, -, 謌 @ 蟄礼ャヲ Advanced_Error3 '%s' 蟾イ陲ォ蜉蜈・蠢ス逡・蟄苓ッ肴ク蜊暮御コ Advanced_Error4 '%s' 蟷カ荳榊惠蠢ス逡・蟄苓ッ肴ク蜊暮 Advanced_Error5 '%s' 蟾イ莉主ソス逡・蟄苓ッ肴ク蜊暮瑚「ォ遘サ髯、莠 Advanced_StopWords 陲ォ蠢ス逡・逧蟄苓ッ Advanced_Message1 POPFile 莨壼ソス逡・荳句苓ソ吩コ帛クク逕ィ逧蟄苓ッ: Advanced_AddWord 蜉蜈・蟄苓ッ Advanced_RemoveWord 遘サ髯、蟄苓ッ Advanced_AllParameters 謇譛臥噪 POPFile 蜿よ焚 Advanced_Parameter 蜿よ焚 Advanced_Value 蛟シ Advanced_Warning 霑呎弍螳梧紛逧 POPFile 蜿よ焚貂蜊. 逾騾ょ粋霑幃亳菴ソ逕ィ閠: 菴蜿ッ莉・蜿俶峩莉サ菴募盾謨ー蛟シ蟷カ謖我ク 譖エ譁ー; 荳崎ソ豐。譛我ササ菴墓惻蛻カ莨壽」譟・霑吩コ帛盾謨ー蛟シ逧譛画譜諤ァ. 莉・邊嶺ス捺仞遉コ逧鬘ケ逶ョ陦ィ遉コ蟾イ扈丈サ朱「隶セ蛟シ陲ォ蜉莉・蜿俶峩莠. 譖エ隸ヲ蟆ス逧騾蛾。ケ菫。諱ッ隸キ隗 OptionReference. Advanced_ConfigFile 扈諤∵。」: History_Filter  (逾譏セ遉コ %s 驍ョ遲) History_FilterBy 霑貊、譚。莉カ History_Search  (謖牙ッ莉カ閠/荳サ譌ィ譚・謳懷ッサ %s) History_Title 譛霑醍噪驍ョ莉カ隶ッ諱ッ History_Jump 霍ウ蛻ー霑吩ク鬘オ History_ShowAll 蜈ィ驛ィ譏セ遉コ History_ShouldBe 蠎碑ッ・隕∵弍 History_NoFrom 豐。譛牙ッ莉カ閠蛻 History_NoSubject 豐。譛我クサ譌ィ蛻 History_ClassifyAs 蛻邀サ謌 History_MagnetUsed 菴ソ逕ィ莠蜷ク體 History_MagnetBecause 菴ソ逕ィ莠蜷ク體

陲ォ蛻邀サ謌 %s 逧蜴溷屏譏ッ %s 蜷ク體

History_ChangedTo 蟾イ蜿俶峩荳コ %s History_Already 驥肴眠蛻邀サ謌 %s History_RemoveAll 蜈ィ驛ィ遘サ髯、 History_RemovePage 遘サ髯、譛ャ鬘オ History_RemoveChecked 遘サ髯、陲ォ譬ク騾臥噪 History_Remove 謖画ュ、遘サ髯、蜴蜿イ驥檎噪鬘ケ逶ョ History_SearchMessage 謳懷ッサ蟇莉カ閠/荳サ譌ィ History_NoMessages 豐。譛蛾ぐ莉カ隶ッ諱ッ History_ShowMagnet 逕ィ莠蜷ク體 History_Negate_Search 雍溷髄謳懷ッサ/霑貊、 History_Magnet  (逾譏セ遉コ逕ア蜷ク體∵園蛻邀サ逧驍ョ莉カ隶ッ諱ッ) History_NoMagnet  (逾譏セ遉コ荳肴弍逕ア蜷ク體∵園蛻邀サ逧驍ョ莉カ隶ッ諱ッ) History_ResetSearch 驥崎ョセ History_ChangedClass 邇ー蝨ィ陲ォ蛻邀サ荳コ History_Purge 蜊ウ蛻サ蛻ー譛 History_Increase 蠅槫刈 History_Decrease 蜃丞ー History_Column_Characters 蜿俶峩蟇莉カ閠, 謾カ莉カ閠, 蜑ッ譛ャ蜥御クサ譌ィ蟄玲ョオ逧螳ス蠎ヲ History_Automatic 閾ェ蜉ィ蛹 History_Reclassified 蟾イ驥肴眠蛻邀サ History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title 蜿」莉、 Password_Enter 霎灘・蜿」莉、 Password_Go 蜀イ! Password_Error1 荳肴ュ」遑ョ逧蜿」莉、 Security_Error1 霑樊磁蝓荳螳夊ヲ∽サ倶コ 1 蜥 65535 荵矩龍 Security_Stealth 鬯シ鬯シ逾溽・滓ィ。蠑/譛榊苅蝎ィ菴應ク Security_NoStealthMode 蜷ヲ (鬯シ鬯シ逾溽・滓ィ。蠑) Security_StealthMode (鬯シ鬯シ逾溽・滓ィ。蠑) Security_ExplainStats (霑吩クェ騾蛾。ケ蠑蜷ッ蜷, POPFile 豈丞、ゥ驛ス莨壻シ騾∽ク谺。荳句嶺ク我クェ謨ー蛟シ蛻ー getpopfile.org 逧荳荳ェ閼壽悽: bc (菴逧驍ョ遲呈焚驥), mc (陲ォ POPFile 蛻邀サ霑逧驍ョ莉カ隶ッ諱ッ諤サ謨ー) 蜥 ec (蛻邀サ髞呵ッッ逧諤サ謨ー). 霑吩コ帶焚蛟シ莨夊「ォ蛯ィ蟄伜芦荳荳ェ譯」譯磯, 辟カ蜷惹シ夊「ォ謌醍畑譚・蜿大ク荳莠帛ウ莠惹ココ莉ャ菴ソ逕ィ POPFile 逧諠蜀オ霍溷カ謌先譜逧扈溯ョ。謨ー謐ョ. 謌醍噪鄂鷹。オ譛榊苅蝎ィ莨壻ソ晉蕗蜈カ譛ャ霄ォ逧譌・蠢玲。」郤ヲ 5 螟ゥ, 辟カ蜷主ーア莨壼刈莉・蛻髯、; 謌台ク堺シ壼お蟄倅ササ菴慕サ溯ョ。荳主黒迢ャ IP 蝨ー蝮髣エ逧蜈ウ閨疲ァ襍キ譚・.) Security_ExplainUpdate (霑吩クェ騾蛾。ケ蠑蜷ッ蜷, POPFile 豈丞、ゥ驛ス莨壻シ騾∽ク谺。荳句嶺ク我クェ謨ー蛟シ蛻ー getpopfile.org 逧荳荳ェ閼壽悽: ma (菴逧 POPFile 逧荳サ隕∫沿譛ャ郛門捷), mi (菴逧 POPFile 逧谺。隕∫沿譛ャ郛門捷) 蜥 bn (菴逧 POPFile 逧蟒コ蜿キ). 譁ー迚域耳蜃コ譌カ, POPFile 莨壽噺蛻ー荳莉ス蝗セ蠖「蜩榊コ, 蟷カ荳疲仞遉コ蝨ィ逕サ髱「鬘カ遶ッ. 謌醍噪鄂鷹。オ譛榊苅蝎ィ莨壻ソ晉蕗蜈カ譛ャ霄ォ逧譌・蠢玲。」郤ヲ 5 螟ゥ, 辟カ蜷主ーア莨壼刈莉・蛻髯、; 謌台ク堺シ壼お蟄倅ササ菴墓峩譁ー譽譟・荳主黒迢ャ IP 蝨ー蝮髣エ逧蜈ウ閨疲ァ襍キ譚・.) Security_PasswordTitle 菴ソ逕ィ閠謗・蜿」蜿」莉、 Security_Password 蜿」莉、 Security_PasswordUpdate 蜿」莉、蟾イ譖エ譁ー Security_AUTHTitle 霑懃ィ区恪蜉。蝎ィ Security_SecureServer 霑懃ィ POP3 譛榊苅蝎ィ (SPA/AUTH 謌也ゥソ騾丞シ丈サ」逅譛榊苅蝎ィ) Security_SecureServerUpdate 霑懃ィ POP3 譛榊苅蝎ィ蟾イ譖エ譁ー荳コ %s Security_SecurePort 霑懃ィ POP3 霑樊磁蝓 (SPA/AUTH 謌也ゥソ騾丞シ丈サ」逅譛榊苅蝎ィ) Security_SecurePortUpdate 霑懃ィ POP3 霑樊磁蝓蟾イ譖エ譁ー荳コ %s Security_SMTPServer SMTP 霑樣煤譛榊苅蝎ィ Security_SMTPServerUpdate SMTP 霑樣煤譛榊苅蝎ィ蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Security_SMTPPort SMTP 霑樣煤霑樊磁蝓 Security_SMTPPortUpdate SMTP 霑樣煤霑樊磁蝓蟾イ譖エ譁ー荳コ %s; 霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Security_POP3 謗・蜿玲擂閾ェ霑懃ィ区惻蝎ィ逧 POP3 閨疲惻 (髴隕驥肴眠豼豢サ POPFile) Security_SMTP 謗・蜿玲擂閾ェ霑懃ィ区惻蝎ィ逧 SMTP 閨疲惻 (髴隕驥肴眠豼豢サ POPFile) Security_NNTP 謗・蜿玲擂閾ェ霑懃ィ区惻蝎ィ逧 NNTP 閨疲惻 (髴隕驥肴眠豼豢サ POPFile) Security_UI 謗・蜿玲擂閾ェ霑懃ィ区惻蝎ィ逧 HTTP (菴ソ逕ィ閠謗・蜿」) 閨疲惻 (髴隕驥肴眠豼豢サ POPFile) Security_XMLRPC 謗・蜿玲擂閾ェ霑懃ィ区惻蝎ィ逧 XML-RPC 閨疲惻 (髴隕驥肴眠豼豢サ POPFile) Security_UpdateTitle 閾ェ蜉ィ譖エ譁ー譽譟・ Security_Update 豈丞、ゥ譽譟・ POPFile 譏ッ蜷ヲ譛画峩譁ー Security_StatsTitle 蝗樊冠扈溯ョ。謨ー謐ョ Security_Stats 豈乗律騾∝コ扈溯ョ。謨ー謐ョ Magnet_Error1 '%s' 蜷ク體∝キイ扈丞ュ伜惠莠 '%s' 驍ョ遲帝御コ Magnet_Error2 譁ー逧 '%s' 蜷ク體∬キ滓里譛臥噪 '%s' 蜷ク體∬オキ莠蜀イ遯, 蜿ッ閭ス莨壼シ戊オキ '%s' 驍ョ遲貞逧豁ァ蠑らサ捺棡. 譁ー逧蜷ク體∽ク堺シ夊「ォ蜉霑帛悉. Magnet_Error3 蟒コ遶区眠逧蜷ク體 '%s' 莠 '%s' 驍ョ遲剃クュ Magnet_CurrentMagnets 邇ー逕ィ逧蜷ク體 Magnet_Message1 荳句礼噪蜷ク體∽シ夊ョゥ菫。莉カ諤サ譏ッ陲ォ蛻邀サ蛻ー迚ケ螳夂噪驍ョ遲帝. Magnet_CreateNew 蟒コ遶区眠逧蜷ク體 Magnet_Explanation 譛芽ソ吩コ帷アサ蛻ォ逧蜷ク體∝庄莉・逕ィ:
  • 蟇莉カ閠蝨ー蝮謌門錐蟄: 荳セ萓区擂隸エ: john@company.com 蟆ア逾莨壼製蜷育音螳夂噪蝨ー蝮,
    company.com 莨壼製蜷亥芦莉サ菴穂サ company.com 蟇蜃コ譚・逧莠コ,
    John Doe 莨壼製蜷育音螳夂噪莠コ, John 莨壼製蜷域園譛臥噪 Johns
  • 謾カ莉カ閠/蜑ッ譛ャ蝨ー蝮謌門錐遘ー: 蟆ア霍溷ッ莉カ閠荳譬キ: 菴譏ッ蜷ク體∫・莨夐宙蟇ケ驍ョ莉カ隶ッ諱ッ驥檎噪 To:/Cc: 蝨ー蝮逕滓譜
  • 荳サ譌ィ蟄苓ッ: 萓句ヲ: hello 莨壼製蜷域園譛我クサ譌ィ驥梧怏 hello 逧驍ョ莉カ隶ッ諱ッ
Magnet_MagnetType 蜷ク體∫アサ蛻ォ Magnet_Value 蛟シ Magnet_Always 諤サ譏ッ蛻蛻ー驍ョ遲 Magnet_Jump 霍ウ蛻ー蜷ク體鬘オ髱「 Bucket_Error1 驍ョ遲貞錐遘ー逾閭ス蜷ォ譛牙ー丞 a 蛻ー z 逧蟄玲ッ, 0 蛻ー 9 逧謨ー蟄, 蜉荳 - 蜥 _ Bucket_Error2 蟾イ扈乗怏蜷堺クコ %s 逧驍ョ遲剃コ Bucket_Error3 蟾イ扈丞サコ遶倶コ蜷堺クコ %s 逧驍ョ遲 Bucket_Error4 隸キ霎灘・髱樒ゥコ逋ス逧蟄苓ッ Bucket_Error5 蟾イ扈乗滑 %s 驍ョ遲呈隼蜷堺クコ %s 莠 Bucket_Error6 蟾イ扈丞唖髯、莠 %s 驍ョ遲剃コ Bucket_Title 驍ョ遲堤サ諤 Bucket_BucketName 驍ョ遲貞錐遘ー Bucket_WordCount 蟄苓ッ崎ョ。謨ー Bucket_WordCounts 蟄苓ッ肴焚逶ョ扈溯ョ。 Bucket_UniqueWords 迢ャ迚ケ逧
蟄苓ッ肴焚 Bucket_SubjectModification 菫ョ謾ケ荳サ譌ィ譬螟エ Bucket_ChangeColor 驍ョ遲帝「懆牡 Bucket_NotEnoughData 謨ー謐ョ荳崎カウ Bucket_ClassificationAccuracy 蛻邀サ蜃遑ョ蠎ヲ Bucket_EmailsClassified 蟾イ蛻邀サ逧驍ョ莉カ隶ッ諱ッ謨ー驥 Bucket_EmailsClassifiedUpper 驍ョ莉カ隶ッ諱ッ蛻邀サ扈捺棡 Bucket_ClassificationErrors 蛻邀サ髞呵ッッ Bucket_Accuracy 蜃遑ョ蠎ヲ Bucket_ClassificationCount 蛻邀サ隶。謨ー Bucket_ClassificationFP 莨ェ髦ウ諤ァ蛻邀サ Bucket_ClassificationFN 莨ェ髦エ諤ァ蛻邀サ Bucket_ResetStatistics 驥崎ョセ扈溯ョ。謨ー謐ョ Bucket_LastReset 蜑肴ャ。驥崎ョセ莠 Bucket_CurrentColor %s 邇ー逕ィ逧鬚懆牡荳コ %s Bucket_SetColorTo 隶セ螳 %s 逧鬚懆牡荳コ %s Bucket_Maintenance 扈エ謚、 Bucket_CreateBucket 逕ィ霑吩クェ蜷榊ュ怜サコ遶矩ぐ遲 Bucket_DeleteBucket 蛻謗画ュ、蜷咲ァー逧驍ョ遲 Bucket_RenameBucket 譖エ謾ケ豁、蜷咲ァー逧驍ョ遲 Bucket_Lookup 譟・謇セ Bucket_LookupMessage 蝨ィ驍ョ遲帝梧衍謇セ蟄苓ッ Bucket_LookupMessage2 譟・謇セ豁、蟄苓ッ咲噪扈捺棡 Bucket_LookupMostLikely %s 譛蜒乗弍蝨ィ %s 莨壼コ邇ー逧蜊戊ッ Bucket_DoesNotAppear

%s 蟷カ譛ェ蜃コ邇ー莠惹ササ菴暮ぐ遲帝 Bucket_DisabledGlobally 蟾イ蜈ィ蝓溷●逕ィ逧 Bucket_To 閾ウ Bucket_Quarantine 髫皮ヲサ驍ョ遲 SingleBucket_Title %s 逧隸ヲ扈謨ー謐ョ SingleBucket_WordCount 驍ョ遲貞ュ苓ッ崎ョ。謨ー SingleBucket_TotalWordCount 蜈ィ驛ィ逧蟄苓ッ崎ョ。謨ー SingleBucket_Percentage 蜊蜈ィ驛ィ逧逋セ蛻豈 SingleBucket_WordTable %s 逧蟄苓ッ崎。ィ SingleBucket_Message1 謖我ク狗エ「蠑暮檎噪蟄玲ッ肴擂逵狗恚謇譛我サ・隸・蟄玲ッ榊シ螟エ逧蟄苓ッ. 謖我ク倶ササ菴募ュ苓ッ榊ーア蜿ッ莉・譟・謇セ螳蝨ィ謇譛蛾ぐ遲帝檎噪蜿ッ閭ス諤ァ. SingleBucket_Unique %s 迢ャ譛臥噪 SingleBucket_ClearBucket 遘サ髯、謇譛臥噪蟄苓ッ Session_Title POPFile 髦カ谿オ譌カ譛溷キイ騾セ譌カ Session_Error 菴逧 POPFile 髦カ谿オ譌カ譛溷キイ扈城セ譛滉コ. 霑吝庄閭ス譏ッ蝗荳コ菴豼豢サ蟷カ蛛懈ュ「莠 POPFile 菴蜊エ菫晄戟鄂鷹。オ豬剰ァ亥勣蠑蜷ッ謇閾エ. 隸キ謖我ク句礼噪體セ謗・荵倶ク譚・扈ァ扈ュ菴ソ逕ィ POPFile. View_Title 蜊穂ク驍ョ莉カ隶ッ諱ッ譽隗 View_ShowFrequencies 譏セ遉コ蟄苓ッ埼「醍紫 View_ShowProbabilities 譏セ遉コ蟄苓ッ榊庄閭ス諤ァ View_ShowScores 譏セ遉コ蟄苓ッ榊セ怜蜿雁愛螳壼崟陦ィ View_WordMatrix 蟄苓ッ咲洸髦オ View_WordProbabilities 豁」蝨ィ譏セ遉コ蟄苓ッ榊庄閭ス諤ァ View_WordFrequencies 豁」蝨ィ譏セ遉コ蟄苓ッ埼「醍紫 View_WordScores 豁」蝨ィ譏セ遉コ蟄苓ッ榊セ怜 View_Chart 蛻、螳壼崟陦ィ View_DownloadMessage 荳玖スス驍ョ莉カ隶ッ諱ッ Windows_TrayIcon 譏ッ蜷ヲ隕∝惠 Windows 逧邉サ扈溷クク鬩サ蛻玲仞遉コ POPFile 蝗セ譬? Windows_Console 譏ッ蜷ヲ隕∝惠蜻ス莉、蛻礼ェ怜哨驥梧鴬陦 POPFile? Windows_NextTime

霑咎。ケ譖エ蜉ィ蝨ィ菴驥肴眠豼豢サ POPFile 蜑埼ス荳堺シ夂函謨 Header_MenuSummary 霑吩クェ陦ィ譬シ譏ッ莉ス蟇シ隗磯牙黒, 閭ス隶ゥ菴蟄伜叙謗ァ蛻カ荳ュ蠢驥御ク榊酔逧豈丈ク荳ェ鬘オ髱「. History_MainTableSummary 霑吩サス陦ィ譬シ蛻怜コ莠譛霑第噺蛻ー逧驍ョ莉カ隶ッ諱ッ逧蟇莉カ閠蜿贋クサ譌ィ, 菴荵溯ス蝨ィ豁、驥肴眠蜉莉・譽隗蟷カ驥肴眠蛻邀サ霑吩コ幃ぐ莉カ隶ッ諱ッ. 謖我ク荳倶クサ譌ィ蛻怜ーア莨壽仞遉コ蜃コ螳梧紛逧驍ョ莉カ隶ッ諱ッ譁蟄, 莉・蜿雁・ケ莉ャ荳コ菴穂シ夊「ォ螯よュ、蛻邀サ逧菫。諱ッ. 菴蜿ッ莉・蝨ィ '蠎碑ッ・隕∵弍' 蟄玲ョオ謖螳夐ぐ莉カ隶ッ諱ッ隸・蠖貞ア樒噪驍ョ遲, 謌冶霑伜次霑咎。ケ蜿俶峩. 螯よ棡譛臥音螳夂噪驍ョ莉カ隶ッ諱ッ蜀堺ケ滉ク埼怙隕∽コ, 菴荵溷庄莉・逕ィ '蛻髯、' 蟄玲ョオ譚・莉主紙蜿イ驥悟刈莉・蛻髯、. History_OpenMessageSummary 霑吩クェ陦ィ譬シ蜷ォ譛画汾荳ェ驍ョ莉カ隶ッ諱ッ逧蜈ィ譁, 蜈カ荳ュ陲ォ鬮倅コョ蠎ヲ譬遉コ逧蟄苓ッ肴弍陲ォ逕ィ譚・蛻邀サ逧, 萓晄紺逧譏ッ螂ケ莉ャ霍滄ぅ荳ェ驍ョ遲呈怙譛牙ウ閨. Bucket_MainTableSummary 霑吩クェ陦ィ譬シ謠蝉セ帑コ蛻邀サ驍ョ遲堤噪讎ょオ. 豈丈ク蛻鈴ス莨壽仞遉コ蜃コ驍ョ遲貞錐遘ー, 隸・驍ョ遲帝檎噪蟄苓ッ肴サ謨ー, 豈丈クェ驍ョ遲帝悟ョ樣刔逧蜊慕峡蟄苓ッ肴焚驥, 驍ョ莉カ隶ッ諱ッ逧荳サ譌ィ蛻玲弍蜷ヲ莨壼惠陲ォ蛻邀サ蛻ー隸・驍ョ遲呈慮荳蟷カ陲ォ菫ョ謾ケ, 譏ッ蜷ヲ隕髫皮ヲサ陲ォ謾カ霑幄ッ・驍ョ遲帝檎噪驍ョ莉カ隶ッ諱ッ, 莉・蜿贋ク荳ェ隶ゥ菴謖鷹蛾「懆牡逧陦ィ譬シ, 霑吩クェ鬚懆牡莨壼惠謗ァ蛻カ荳ュ蠢驥梧仞遉コ莠惹ササ菴戊キ溯ッ・驍ョ遲呈怏蜈ウ逧蝨ー譁ケ. Bucket_StatisticsTableSummary 霑吩クェ陦ィ譬シ謠蝉セ帑コ荳臥サ霍 POPFile 謨エ菴捺譜閭ス譛牙ウ逧扈溯ョ。謨ー謐ョ. 隨ャ荳扈譏ッ蜈カ蛻邀サ蜃遑ョ蠎ヲ螯ゆス, 隨ャ莠檎サ譏ッ蜈ア譛牙、壼ー鷹ぐ莉カ隶ッ諱ッ陲ォ蜉莉・蛻邀サ蛻ー驍」荳ェ驍ョ遲帝, 隨ャ荳臥サ譏ッ豈丈クェ驍ョ遲帝梧怏螟壼ー大ュ苓ッ榊所蜈カ蜈ウ閨皮卆蛻豈. Bucket_MaintenanceTableSummary 霑吩クェ陦ィ譬シ蜷ォ譛我ク荳ェ陦ィ蜊, 隶ゥ菴閭ス螟溷サコ遶, 蛻髯、, 謌夜肴眠蜻ス蜷肴汾荳ェ驍ョ遲, 荵溷庄莉・蝨ィ謇譛臥噪驍ョ遲帝梧衍謇セ譟蝉クェ蟄苓ッ, 逵狗恚蜈カ蜈ウ閨泌庄閭ス諤ァ. Bucket_AccuracyChartSummary 霑吩クェ陦ィ譬シ逕ィ蝗セ蠖「譏セ遉コ莠驍ョ莉カ隶ッ諱ッ蛻邀サ逧蜃遑ョ蠎ヲ. Bucket_BarChartSummary 霑吩クェ陦ィ譬シ逕ィ蝗セ蠖「譏セ遉コ莠荳榊酔驍ョ遲呈園蜊謐ョ逧逋セ蛻豈. 霑吝酔譌カ隶。邂嶺コ陲ォ蛻邀サ逧驍ョ莉カ隶ッ諱ッ謨ー驥, 莉・蜿雁ィ驛ィ逧蟄苓ッ崎ョ。謨ー. Bucket_LookupResultsSummary 霑吩クェ陦ィ譬シ譏セ遉コ莠荳主ーク菴馴御ササ菴慕サ吝ョ壼ュ苓ッ榊ウ閨皮噪蜿ッ閭ス諤ァ. 蟇ケ莠取ッ丈クェ驍ョ遲呈擂隸エ, 螂ケ驛ス莨壽仞遉コ蜃コ隸・蟄苓ッ榊書逕溽噪鬚醍紫, 蟄苓ッ堺シ壼コ邇ー蝨ィ隸・驍ョ遲帝檎噪蜿ッ閭ス諤ァ, 莉・蜿雁ス楢ッ・蟄苓ッ榊コ邇ー蝨ィ驍ョ莉カ隶ッ諱ッ驥梧慮, 蟇ケ莠手ッ・驍ョ遲貞セ怜逧謨エ菴灘スア蜩. Bucket_WordListTableSummary 霑吩クェ陦ィ譬シ謠蝉セ帑コ迚ケ螳夐ぐ遲帝悟ィ驛ィ逧蟄苓ッ肴ク蜊, 謖臥ァ蠑螟エ逧蟄玲ッ埼仙玲紛逅. Magnet_MainTableSummary 霑吩クェ陦ィ譬シ譏セ遉コ莠蜷ク體∵ク蜊, 霑吩コ帛精體∵弍逕ィ譚・謖臥ァ蝗コ螳夊ァ蛻呎滑驍ョ莉カ隶ッ諱ッ蜉莉・蛻邀サ逧. 豈丈ク蛻鈴ス莨壽仞遉コ蜃コ蜷ク體∝ヲゆス戊「ォ螳壻ケ芽送, 蜈カ謇隗願ァ守噪驍ョ遲, 霑俶怏逕ィ譚・蛻髯、隸・蜷ク體∫噪謖蛾聴. Configuration_MainTableSummary 霑吩クェ陦ィ譬シ蜷ォ譛画焚荳ェ陦ィ蜊, 隶ゥ菴謗ァ蛻カ POPFile 逧扈諤. Configuration_InsertionTableSummary 霑吩クェ陦ィ譬シ蜷ォ譛我ク莠帶潔髓ョ, 蛻、譁ュ譏ッ蜷ヲ隕∝惠驍ョ莉カ隶ッ諱ッ騾帝∫サ咎ぐ莉カ逕ィ謌キ遶ッ遞句コ丞燕, 蜈郁。御ソョ謾ケ譬螟エ謌紋クサ譌ィ蛻. Security_MainTableSummary 霑吩クェ陦ィ譬シ謠蝉セ帑コ蜃扈謗ァ蛻カ, 閭ス蠖ア蜩 POPFile 謨エ菴鍋サ諤∫噪螳牙ィ, 譏ッ蜷ヲ隕∬ェ蜉ィ譽譟・遞句コ乗峩譁ー, 莉・蜿頑弍蜷ヲ隕∵滑 POPFile 謨郁ス扈溯ョ。謨ー謐ョ逧荳闊ャ菫。諱ッ莨蝗樒ィ句コ丈ス懆逧荳ュ螟ョ謨ー謐ョ蠎. Advanced_MainTableSummary 霑吩クェ陦ィ譬シ謠蝉セ帑コ荳莉ス POPFile 蛻邀サ驍ョ莉カ隶ッ諱ッ譌カ謇莨壼ソス逡・逧蟄苓ッ肴ク蜊, 蝗荳コ莉紋サャ蝨ィ荳闊ャ驍ョ莉カ隶ッ諱ッ驥檎噪蜈ウ閨碑ソ莠朱「醍ケ. 螂ケ莉ャ莨夊「ォ謖臥ァ蟄苓ッ榊シ螟エ逧蟄嶺コゥ陲ォ騾仙玲紛逅. Imap_Bucket2Folder '%s' 驍ョ遲堤噪菫。莉カ閾ウ驍ョ莉カ蛹」 Imap_MapError 菴荳崎ス謚願カ霑荳荳ェ逧驍ョ遲貞ッケ蠎泌芦蜊穂ク逧驍ョ莉カ蛹」驥! Imap_Server IMAP 譛榊苅蝎ィ荳サ譛コ蜷咲ァー: Imap_ServerNameError 隸キ霎灘・譛榊苅蝎ィ逧荳サ譛コ蜷咲ァー! Imap_Port IMAP 譛榊苅蝎ィ霑樊磁蝓: Imap_PortError 隸キ霎灘・譛画譜逧霑樊磁蝓蜿キ遐! Imap_Login IMAP 蟶仙捷逋サ蜈・: Imap_LoginError 隸キ霎灘・菴ソ逕ィ閠/逋サ蜈・蜷咲ァー! Imap_Password IMAP 蟶仙捷逧蜿」莉、: Imap_PasswordError 隸キ霎灘・隕∫畑莠取恪蜉。蝎ィ逧蜿」莉、! Imap_Expunge 莉手「ォ逶題ァ逧菫。莉カ蛹」驥梧ク髯、蟾イ陲ォ蛻髯、逧驍ョ莉カ隶ッ諱ッ. Imap_Interval 譖エ譁ー髣エ髫皮ァ呈焚: Imap_IntervalError 隸キ霎灘・莉倶コ 10 遘定ウ 3600 遘帝龍逧髣エ髫. Imap_Bytelimit 豈丞ー驍ョ莉カ隶ッ諱ッ隕∫畑譚・蛻邀サ逧蟄苓鰍謨ー. 霎灘・ 0 (遨コ) 陦ィ遉コ螳梧紛逧驍ョ莉カ隶ッ諱ッ: Imap_BytelimitError 隸キ霎灘・謨ー蛟シ. Imap_RefreshFolders 驥肴眠謨エ逅驍ョ莉カ蛹」貂蜊 Imap_Now 邇ー蝨ィ! Imap_UpdateError1 譌豕慕匳蜈・. 隸キ鬪瑚ッ∽ス逧逋サ蜈・蜷咲ァー霍溷哨莉、. Imap_UpdateError2 霑樊磁閾ウ譛榊苅蝎ィ螟ア雍・. 隸キ譽譟・荳サ譛コ蜷咲ァー霍溯ソ樊磁蝓, 蟷カ隸キ遑ョ隶、菴豁」蝨ィ郤ソ荳. Imap_UpdateError3 隸キ蜈育サ諤∬#譛コ扈闃. Imap_NoConnectionMessage 隸キ蜈育サ諤∬#譛コ扈闃. 蠖謎ス螳梧仙錘, 霑吩ク鬘オ驥悟ーア莨壼コ邇ー譖エ螟壼庄逕ィ逧騾蛾。ケ. Imap_WatchMore 陲ォ逶題ァ驍ョ莉カ蛹」貂蜊慕噪驍ョ莉カ蛹」 Imap_WatchedFolder 陲ォ逶題ァ逧驍ョ莉カ蛹」郛門捷 Imap_Use_SSL 菴ソ逕ィ SSL Shutdown_Message POPFile 蟾イ扈剰「ォ蛛懈脂莠 Help_Training 蠖謎ス蛻晄ャ。菴ソ逕ィ POPFile 譌カ, 螂ケ蝠・荵滉ク肴り碁怙隕∬「ォ蜉莉・隹謨. POPFile 逧豈丈ク荳ェ驍ョ遲帝ス髴隕∫畑驍ョ莉カ隶ッ諱ッ譚・蜉莉・隹謨, 逾譛牙ス謎ス驥肴眠謚頑汾荳ェ陲ォ POPFile 髞呵ッッ蛻邀サ逧驍ョ莉カ隶ッ諱ッ驥肴眠蛻邀サ蛻ー豁」遑ョ逧驍ョ遲呈慮, 謇咲悄逧譏ッ蝨ィ隹謨吝・ケ. 蜷梧慮菴荵溷セ苓ョセ螳壻ス逧驍ョ莉カ逕ィ謌キ遶ッ遞句コ, 譚・謖臥ァ POPFile 逧蛻邀サ扈捺棡蜉莉・霑貊、驍ョ莉カ隶ッ諱ッ. 蜈ウ莠手ョセ螳夂畑謌キ遶ッ霑貊、蝎ィ逧菫。諱ッ蜿ッ莉・蝨ィ POPFile 譁莉カ隶。逕サ驥瑚「ォ謇セ蛻ー. Help_Bucket_Setup POPFile 髯、莠 "譛ェ蛻邀サ (unclassified)" 逧蛛驍ョ遲貞、, 霑倬怙隕∬ウ蟆台ク、荳ェ驍ョ遲. 閠 POPFile 逧迢ャ迚ケ荵句、豁」蝨ィ莠主・ケ蟇ケ逕オ蟄宣ぐ莉カ逧蛹コ蛻譖エ閭應コ取ュ、, 菴逕夊ウ蜿ッ莉・譛我ササ諢乗焚驥冗噪驍ョ遲. 邂蜊慕噪隶セ螳壻シ壽弍蜒 "蝙蝨セ (spam)", "荳ェ莠コ (personal)", 蜥 "蟾・菴 (work)" 驍ョ遲. Help_No_More 蛻ォ蜀肴仞遉コ霑吩クェ隸エ譏惹コ popfile-1.1.3+dfsg/languages/Chinese-Simplified-GB2312.msg0000664000175000017500000006004111624177330022267 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # POPFile 1.0.0 Simplified Chinese Translation # Created By Jedi Lin, 2004/09/19 # In fact translated from Traditional Chinese by Encode::HanConvert # Modified By Jedi Lin, 2007/12/25 # Identify the language and character set used for the interface LanguageCode cn LanguageCharset GB2312 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage zh-cn # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply フラモテ ApplyChanges フラモテア荳 On ソェ Off ケリ TurnOn エソェ TurnOff ケリノマ Add シモネ Remove メニウ Previous ヌーメサメウ Next マツメサメウ From シトシユ゚ Subject ヨヨシ Cc クアアセ Classification モハヘイ Reclassify ヨリミツキヨタ Probability ソノトワミヤ Scores キヨハ QuickMagnets ソヒルホフ Undo サケヤュ Close ケリアユ Find ムーユメ Filter ケツヒニ Yes ハヌ No キ ChangeToYes クトウノハヌ ChangeToNo クトウノキ Bucket モハヘイ Magnet ホフ Delete ノセウ Create スィチ「 To ハユシネヒ Total ネォイソ Rename クテ Frequency ニオツハ Probability ソノトワミヤ Score キヨハ Lookup イ鰈メ Word ラヨエハ Count シニハ Update クミツ Refresh ヨリミツユタ FAQ ウ」シホハエシッ ID ID Date ネユニレ Arrived ハユシハアシ Size エミ。 # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %m/%d %T %z | %A %Y/%m/%d %T %z # The header and footer that appear on every UI page Header_Title POPFile ソリヨニヨミミト Header_Shutdown ヘ」オ POPFile Header_History タハキ Header_Buckets モハヘイ Header_Configuration ラ鯲ャ Header_Advanced ススラ Header_Security ーイネォ Header_Magnets ホフ Footer_HomePage POPFile ハラメウ Footer_Manual ハヨイ Footer_Forums フヨツロヌ Footer_FeedMe セ靹 Footer_RequestFeature ケヲトワヌヌ Footer_MailingList モハオンツロフ Footer_Wiki ホトシシッ Configuration_Error1 キヨクキオoトワハヌオ・メサオトラヨキ Configuration_Error2 ハケモテユ゚スモソレオトチャスモイコメサカィメェス鰌レ 1 コヘ 65535 ヨョシ Configuration_Error3 POP3 フチャスモイコメサカィメェス鰌レ 1 コヘ 65535 ヨョシ Configuration_Error4 メウテ豢ミ。メサカィメェス鰌レ 1 コヘ 1000 ヨョシ Configuration_Error5 タハキタメェア」チオトネユハメサカィメェス鰌レ 1 コヘ 366 ヨョシ Configuration_Error6 TCP モ簗アヨオメサカィメェス鰌レ 10 コヘ 1800 ヨョシ Configuration_Error7 XML RPC フチャスモイコメサカィメェス鰌レ 1 コヘ 65535 ヨョシ Configuration_Error8 SOCKS V エタキホニチャスモイコメサカィメェス鰌レ 1 コヘ 65535 ヨョシ Configuration_POP3Port POP3 フチャスモイコ Configuration_POP3Update POP3 チャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Configuration_XMLRPCUpdate XML-RPC チャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Configuration_XMLRPCPort XML-RPC フチャスモイコ Configuration_SMTPPort SMTP フチャスモイコ Configuration_SMTPUpdate SMTP チャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Configuration_NNTPPort NNTP フチャスモイコ Configuration_NNTPUpdate NNTP チャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Configuration_POPFork ヤハミヨリクエオト POP3 チェサ Configuration_SMTPFork ヤハミヨリクエオト SMTP チェサ Configuration_NNTPFork ヤハミヨリクエオト NNTP チェサ Configuration_POP3Separator POP3 ヨサ:チャスモイコ:ハケモテユ゚ キヨクキ Configuration_NNTPSeparator NNTP ヨサ:チャスモイコ:ハケモテユ゚ キヨクキ Configuration_POP3SepUpdate POP3 オトキヨクキメムクミツホェ %s Configuration_NNTPSepUpdate NNTP オトキヨクキメムクミツホェ %s Configuration_UI ハケモテユ゚スモソレヘメウチャスモイコ Configuration_UIUpdate ハケモテユ゚スモソレヘメウチャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Configuration_History テソメサメウヒメェチミウオトモハシムカマ「ハチソ Configuration_HistoryUpdate テソメサメウヒメェチミウオトモハシムカマ「ハチソメムクミツホェ %s Configuration_Days タハキタヒメェア」チオトフハ Configuration_DaysUpdate タハキタヒメェア」チオトフハメムクミツホェ %s Configuration_UserInterface ハケモテユ゚スモソレ Configuration_Skins ヘ篁ロムハス Configuration_SkinsChoose ム。ヤヘ篁ロムハス Configuration_Language モムヤ Configuration_LanguageChoose ム。ヤモムヤ Configuration_ListenPorts ト」ソ鰉。マ Configuration_HistoryView タハキシハモ Configuration_TCPTimeout チェサモ簗ア Configuration_TCPTimeoutSecs チェサモ簗アテハ Configuration_TCPTimeoutUpdate チェサモ簗アテハメムクミツホェ %s Configuration_ClassificationInsertion イ衒モハシムカマ「ホトラヨ Configuration_SubjectLine ア荳ヨヨシチミ Configuration_XTCInsertion ヤレアヘキイ衒
X-Text-Classification Configuration_XPLInsertion ヤレアヘキイ衒
X-POPFile-Link Configuration_Logging ネユヨセ Configuration_None ボ Configuration_ToScreen ハ莎ヨチニチトサ (Console) Configuration_ToFile ハ莎ヨチオオーク Configuration_ToScreenFile ハ莎ヨチニチトサシーオオーク Configuration_LoggerOutput ネユヨセハ莎キスハス Configuration_GeneralSkins ヘ篁ロムハス Configuration_SmallSkins ミ。ミヘヘ篁ロムハス Configuration_TinySkins ホ「ミヘヘ篁ロムハス Configuration_CurrentLogFile <シハモトソヌーオトネユヨセオオ> Configuration_SOCKSServer SOCKS V エタキホニヨサ Configuration_SOCKSPort SOCKS V エタキホニチャスモイコ Configuration_SOCKSPortUpdate SOCKS V エタキホニチャスモイコメムクミツホェ %s Configuration_SOCKSServerUpdate SOCKS V エタキホニヨサメムクミツホェ %s Configuration_Fields タハキラヨカホ Advanced_Error1 '%s' メムセュヤレコツヤラヨエハヌ蠏・タチヒ Advanced_Error2 メェアサコツヤオトラヨエハストワーコャラヨトクハラヨ, ., _, -, サ @ ラヨキ Advanced_Error3 '%s' メムアサシモネコツヤラヨエハヌ蠏・タチヒ Advanced_Error4 '%s' イ「イサヤレコツヤラヨエハヌ蠏・タ Advanced_Error5 '%s' メムエモコツヤラヨエハヌ蠏・タアサメニウチヒ Advanced_StopWords アサコツヤオトラヨエハ Advanced_Message1 POPFile サ蘯ツヤマツチミユ簟ゥウ」モテオトラヨエハ: Advanced_AddWord シモネラヨエハ Advanced_RemoveWord メニウラヨエハ Advanced_AllParameters ヒモミオト POPFile イホハ Advanced_Parameter イホハ Advanced_Value ヨオ Advanced_Warning ユ簗ヌヘユオト POPFile イホハヌ蠏・. オoハハコマススラハケモテユ゚: ト譱ノメヤア荳ネホコホイホハヨオイ「ーエマツ クミツ; イサケテサモミネホコホサヨニサ眈イ鰈簟ゥイホハヨオオトモミミァミヤ. メヤエヨフ袞ヤハセオトマトソアハセメムセュエモヤ、ノ靹オアサシモメヤア荳チヒ. クマセ。オトム。マミナマ「ヌシ OptionReference. Advanced_ConfigFile ラ鯲ャオオ: History_Filter  (オoマヤハセ %s モハヘイ) History_FilterBy ケツヒフシ History_Search  (ーエシトシユ゚/ヨヨシタエヒムムー %s) History_Title ラスオトモハシムカマ「 History_Jump フオスユ簫サメウ History_ShowAll ネォイソマヤハセ History_ShouldBe モヲクテメェハヌ History_NoFrom テサモミシトシユ゚チミ History_NoSubject テサモミヨヨシチミ History_ClassifyAs キヨタ犁ノ History_MagnetUsed ハケモテチヒホフ History_MagnetBecause ハケモテチヒホフ

アサキヨタ犁ノ %s オトヤュメハヌ %s ホフ

History_ChangedTo メムア荳ホェ %s History_Already ヨリミツキヨタ犁ノ %s History_RemoveAll ネォイソメニウ History_RemovePage メニウアセメウ History_RemoveChecked メニウアサコヒム。オト History_Remove ーエエヒメニウタハキタオトマトソ History_SearchMessage ヒムムーシトシユ゚/ヨヨシ History_NoMessages テサモミモハシムカマ「 History_ShowMagnet モテチヒホフ History_Negate_Search クコマヒムムー/ケツヒ History_Magnet  (オoマヤハセモノホフヒキヨタ犒トモハシムカマ「) History_NoMagnet  (オoマヤハセイサハヌモノホフヒキヨタ犒トモハシムカマ「) History_ResetSearch ヨリノ History_ChangedClass マヨヤレアサキヨタ猥ェ History_Purge シエソフオスニレ History_Increase ヤシモ History_Decrease シノル History_Column_Characters ア荳シトシユ゚, ハユシユ゚, クアアセコヘヨヨシラヨカホオトソカネ History_Automatic ラヤカッサッ History_Reclassified メムヨリミツキヨタ History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title ソレチ Password_Enter ハ菠ソレチ Password_Go ウ! Password_Error1 イサユネキオトソレチ Security_Error1 チャスモイコメサカィメェス鰌レ 1 コヘ 65535 ヨョシ Security_Stealth ケケヒヒト」ハス/キホニラメオ Security_NoStealthMode キ (ケケヒヒト」ハス) Security_StealthMode (ケケヒヒト」ハス) Security_ExplainStats (ユ篋ム。マソェニコ, POPFile テソフカシサ盒ォヒヘメサエホマツチミネクハヨオオス getpopfile.org オトメサクスナアセ: bc (ト羞トモハヘイハチソ), mc (アサ POPFile キヨタ犹オトモハシムカマ「ラワハ) コヘ ec (キヨタ犇ホオトラワハ). ユ簟ゥハヨオサ盂サエ「エ豬スメサクオオークタ, ネサコサ盂サホメモテタエキ「イシメサミゥケリモレネヒテヌハケモテ POPFile オトヌ鯀クニ莎ノミァオトヘウシニハセン. ホメオトヘメウキホニサ盂」チニ莖セノオトネユヨセオオヤシ 5 フ, ネサコセヘサ眈モメヤノセウ; ホメイササ盒「エ貶ホコホヘウシニモオ・カタ IP オリヨキシ莊トケリチェミヤニタエ.) Security_ExplainUpdate (ユ篋ム。マソェニコ, POPFile テソフカシサ盒ォヒヘメサエホマツチミネクハヨオオス getpopfile.org オトメサクスナアセ: ma (ト羞ト POPFile オトヨメェー豎セア犲ナ), mi (ト羞ト POPFile オトエホメェー豎セア犲ナ) コヘ bn (ト羞ト POPFile オトスィコナ). ミツー賚ニウハア, POPFile サ睫ユオスメサキンヘシミホマモヲ, イ「ヌメマヤハセヤレサュテ豸・カヒ. ホメオトヘメウキホニサ盂」チニ莖セノオトネユヨセオオヤシ 5 フ, ネサコセヘサ眈モメヤノセウ; ホメイササ盒「エ貶ホコホクミツシイ鰌オ・カタ IP オリヨキシ莊トケリチェミヤニタエ.) Security_PasswordTitle ハケモテユ゚スモソレソレチ Security_Password ソレチ Security_PasswordUpdate ソレチメムクミツ Security_AUTHTitle ヤカウフキホニ Security_SecureServer ヤカウフ POP3 キホニ (SPA/AUTH サエゥヘクハスエタキホニ) Security_SecureServerUpdate ヤカウフ POP3 キホニメムクミツホェ %s Security_SecurePort ヤカウフ POP3 チャスモイコ (SPA/AUTH サエゥヘクハスエタキホニ) Security_SecurePortUpdate ヤカウフ POP3 チャスモイコメムクミツホェ %s Security_SMTPServer SMTP チャヒキホニ Security_SMTPServerUpdate SMTP チャヒキホニメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Security_SMTPPort SMTP チャヒチャスモイコ Security_SMTPPortUpdate SMTP チャヒチャスモイコメムクミツホェ %s; ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Security_POP3 スモハワタエラヤヤカウフサニオト POP3 チェサ (ミ靨ェヨリミツシ、サ POPFile) Security_SMTP スモハワタエラヤヤカウフサニオト SMTP チェサ (ミ靨ェヨリミツシ、サ POPFile) Security_NNTP スモハワタエラヤヤカウフサニオト NNTP チェサ (ミ靨ェヨリミツシ、サ POPFile) Security_UI スモハワタエラヤヤカウフサニオト HTTP (ハケモテユ゚スモソレ) チェサ (ミ靨ェヨリミツシ、サ POPFile) Security_XMLRPC スモハワタエラヤヤカウフサニオト XML-RPC チェサ (ミ靨ェヨリミツシ、サ POPFile) Security_UpdateTitle ラヤカックミツシイ Security_Update テソフシイ POPFile ハヌキモミクミツ Security_StatsTitle サリアィヘウシニハセン Security_Stats テソネユヒヘウヘウシニハセン Magnet_Error1 '%s' ホフメムセュエ贇レモレ '%s' モハヘイタチヒ Magnet_Error2 ミツオト '%s' ホフクシネモミオト '%s' ホフニチヒウ袁サ, ソノトワサ瞑ニ '%s' モハヘイトレオトニ醴ス盪. ミツオトホフイササ盂サシモスネ・. Magnet_Error3 スィチ「ミツオトホフ '%s' モレ '%s' モハヘイヨミ Magnet_CurrentMagnets マヨモテオトホフ Magnet_Message1 マツチミオトホフサ睚テミナシラワハヌアサキヨタ犒スフリカィオトモハヘイタ. Magnet_CreateNew スィチ「ミツオトホフ Magnet_Explanation モミユ簟ゥタ牾オトホフソノメヤモテ:
  • シトシユ゚オリヨキサテラヨ: セルタタエヒオ: john@company.com セヘオoサ睾ヌコマフリカィオトオリヨキ,
    company.com サ睾ヌコマオスネホコホエモ company.com シトウタエオトネヒ,
    John Doe サ睾ヌコマフリカィオトネヒ, John サ睾ヌコマヒモミオト Johns
  • ハユシユ゚/クアアセオリヨキサテウニ: セヘクシトシユ゚メサム: オォハヌホフオoサ瞰カヤモハシムカマ「タオト To:/Cc: オリヨキノミァ
  • ヨヨシラヨエハ: タネ: hello サ睾ヌコマヒモミヨヨシタモミ hello オトモハシムカマ「
Magnet_MagnetType ホフタ牾 Magnet_Value ヨオ Magnet_Always ラワハヌキヨオスモハヘイ Magnet_Jump フオスホフメウテ Bucket_Error1 モハヘイテウニオoトワコャモミミ。ミエ a オス z オトラヨトク, 0 オス 9 オトハラヨ, シモノマ - コヘ _ Bucket_Error2 メムセュモミテホェ %s オトモハヘイチヒ Bucket_Error3 メムセュスィチ「チヒテホェ %s オトモハヘイ Bucket_Error4 ヌハ菠キヌソユーラオトラヨエハ Bucket_Error5 メムセューム %s モハヘイクトテホェ %s チヒ Bucket_Error6 メムセュノセウチヒ %s モハヘイチヒ Bucket_Title モハヘイラ鯲ャ Bucket_BucketName モハヘイテウニ Bucket_WordCount ラヨエハシニハ Bucket_WordCounts ラヨエハハトソヘウシニ Bucket_UniqueWords カタフリオト
ラヨエハハ Bucket_SubjectModification ミ゙クトヨヨシアヘキ Bucket_ChangeColor モハヘイムユノォ Bucket_NotEnoughData ハセンイサラ Bucket_ClassificationAccuracy キヨタ獸シネキカネ Bucket_EmailsClassified メムキヨタ犒トモハシムカマ「ハチソ Bucket_EmailsClassifiedUpper モハシムカマ「キヨタ狄盪 Bucket_ClassificationErrors キヨタ犇ホ Bucket_Accuracy ラシネキカネ Bucket_ClassificationCount キヨタ狆ニハ Bucket_ClassificationFP ホアムミヤキヨタ Bucket_ClassificationFN ホアメミヤキヨタ Bucket_ResetStatistics ヨリノ靉ウシニハセン Bucket_LastReset ヌーエホヨリノ勒レ Bucket_CurrentColor %s マヨモテオトムユノォホェ %s Bucket_SetColorTo ノ雜ィ %s オトムユノォホェ %s Bucket_Maintenance ホャサ、 Bucket_CreateBucket モテユ篋テラヨスィチ「モハヘイ Bucket_DeleteBucket ノセオエヒテウニオトモハヘイ Bucket_RenameBucket ククトエヒテウニオトモハヘイ Bucket_Lookup イ鰈メ Bucket_LookupMessage ヤレモハヘイタイ鰈メラヨエハ Bucket_LookupMessage2 イ鰈メエヒラヨエハオトス盪 Bucket_LookupMostLikely %s ラマハヌヤレ %s サ盖マヨオトオ・エハ Bucket_DoesNotAppear

%s イ「ホエウマヨモレネホコホモハヘイタ Bucket_DisabledGlobally メムネォモヘ」モテオト Bucket_To ヨチ Bucket_Quarantine クタモハヘイ SingleBucket_Title %s オトママクハセン SingleBucket_WordCount モハヘイラヨエハシニハ SingleBucket_TotalWordCount ネォイソオトラヨエハシニハ SingleBucket_Percentage ユシネォイソオトールキヨアネ SingleBucket_WordTable %s オトラヨエハア SingleBucket_Message1 ーエマツヒメタオトラヨトクタエソエソエヒモミメヤクテラヨトクソェヘキオトラヨエハ. ーエマツネホコホラヨエハセヘソノメヤイ鰈メヒヤレヒモミモハヘイタオトソノトワミヤ. SingleBucket_Unique %s カタモミオト SingleBucket_ClearBucket メニウヒモミオトラヨエハ Session_Title POPFile スラカホハアニレメムモ簗ア Session_Error ト羞ト POPFile スラカホハアニレメムセュモ簇レチヒ. ユ篩ノトワハヌメホェト羮、サイ「ヘ」ヨケチヒ POPFile オォネエア」ウヨヘメウ莟タタニソェニヒヨツ. ヌーエマツチミオトチエスモヨョメサタエシフミハケモテ POPFile. View_Title オ・メサモハシムカマ「シハモ View_ShowFrequencies マヤハセラヨエハニオツハ View_ShowProbabilities マヤハセラヨエハソノトワミヤ View_ShowScores マヤハセラヨエハオテキヨシーナミカィヘシア View_WordMatrix ラヨエハセリユ View_WordProbabilities ユヤレマヤハセラヨエハソノトワミヤ View_WordFrequencies ユヤレマヤハセラヨエハニオツハ View_WordScores ユヤレマヤハセラヨエハオテキヨ View_Chart ナミカィヘシア View_DownloadMessage マツヤリモハシムカマ「 Windows_TrayIcon ハヌキメェヤレ Windows オトマオヘウウ」ラ、チミマヤハセ POPFile ヘシア? Windows_Console ハヌキメェヤレテチチミエーソレタヨエミミ POPFile? Windows_NextTime

ユ簪クカッヤレト聊リミツシ、サ POPFile ヌーカシイササ睨ミァ Header_MenuSummary ユ篋アクハヌキンオシタタム。オ・, トワネテト羔貶。ソリヨニヨミミトタイサヘャオトテソメサクメウテ. History_MainTableSummary ユ箙ンアクチミウチヒラスハユオスオトモハシムカマ「オトシトシユ゚シーヨヨシ, ト耡イトワヤレエヒヨリミツシモメヤシハモイ「ヨリミツキヨタ獨簟ゥモハシムカマ「. ーエメサマツヨヨシチミセヘサ睹ヤハセウヘユオトモハシムカマ「ホトラヨ, メヤシーヒテヌホェコホサ盂サネ邏ヒキヨタ犒トミナマ「. ト譱ノメヤヤレ 'モヲクテメェハヌ' ラヨカホヨクカィモハシムカマ「クテケ鯡オトモハヘイ, サユ゚サケヤュユ簪ア荳. ネ郢モミフリカィオトモハシムカマ「ヤルメイイサミ靨ェチヒ, ト耡イソノメヤモテ 'ノセウ' ラヨカホタエエモタハキタシモメヤノセウ. History_OpenMessageSummary ユ篋アクコャモミトウクモハシムカマ「オトネォホト, ニ葷ミアサク゚チチカネアハセオトラヨエハハヌアサモテタエキヨタ犒ト, メタセンオトハヌヒテヌクトヌクモハヘイラモミケリチェ. Bucket_MainTableSummary ユ篋アクフ盪ゥチヒキヨタ獗ハヘイオトクナソ. テソメサチミカシサ睹ヤハセウモハヘイテウニ, クテモハヘイタオトラヨエハラワハ, テソクモハヘイタハオシハオトオ・カタラヨエハハチソ, モハシムカマ「オトヨヨシチミハヌキサ瞞レアサキヨタ犒スクテモハヘイハアメサイ「アサミ゙クト, ハヌキメェクタアサハユスクテモハヘイタオトモハシムカマ「, メヤシーメサクネテト耄ム。ムユノォオトアク, ユ篋ムユノォサ瞞レソリヨニヨミミトタマヤハセモレネホコホククテモハヘイモミケリオトオリキス. Bucket_StatisticsTableSummary ユ篋アクフ盪ゥチヒネラ鮑 POPFile ユフ衵ァトワモミケリオトヘウシニハセン. オレメサラ鯡ヌニ莵ヨタ獸シネキカネネ郤ホ, オレカラ鯡ヌケイモミカ猖ルモハシムカマ「アサシモメヤキヨタ犒ストヌクモハヘイタ, オレネラ鯡ヌテソクモハヘイタモミカ猖ルラヨエハシーニ荵リチェールキヨアネ. Bucket_MaintenanceTableSummary ユ篋アクコャモミメサクアオ・, ネテト翔ワケサスィチ「, ノセウ, サヨリミツテテトウクモハヘイ, メイソノメヤヤレヒモミオトモハヘイタイ鰈メトウクラヨエハ, ソエソエニ荵リチェソノトワミヤ. Bucket_AccuracyChartSummary ユ篋アクモテヘシミホマヤハセチヒモハシムカマ「キヨタ犒トラシネキカネ. Bucket_BarChartSummary ユ篋アクモテヘシミホマヤハセチヒイサヘャモハヘイヒユシセンオトールキヨアネ. ユ簣ャハアシニヒ翆ヒアサキヨタ犒トモハシムカマ「ハチソ, メヤシーネォイソオトラヨエハシニハ. Bucket_LookupResultsSummary ユ篋アクマヤハセチヒモハャフ蠡ネホコホクカィラヨエハケリチェオトソノトワミヤ. カヤモレテソクモハヘイタエヒオ, ヒカシサ睹ヤハセウクテラヨエハキ「ノオトニオツハ, ラヨエハサ盖マヨヤレクテモハヘイタオトソノトワミヤ, メヤシーオアクテラヨエハウマヨヤレモハシムカマ「タハア, カヤモレクテモハヘイオテキヨオトユフ衲ーマ. Bucket_WordListTableSummary ユ篋アクフ盪ゥチヒフリカィモハヘイタネォイソオトラヨエハヌ蠏・, ーエユユソェヘキオトラヨトクヨチミユタ. Magnet_MainTableSummary ユ篋アクマヤハセチヒホフヌ蠏・, ユ簟ゥホフハヌモテタエーエユユケフカィケ贇ームモハシムカマ「シモメヤキヨタ犒ト. テソメサチミカシサ睹ヤハセウホフネ郤ホアサカィメ袒, ニ萢鳰オトモハヘイ, サケモミモテタエノセウクテホフオトーエナ・. Configuration_MainTableSummary ユ篋アクコャモミハクアオ・, ネテト譱リヨニ POPFile オトラ鯲ャ. Configuration_InsertionTableSummary ユ篋アクコャモミメサミゥーエナ・, ナミカマハヌキメェヤレモハシムカマ「オンヒヘクモハシモテサァカヒウフミヌー, マネミミミ゙クトアヘキサヨヨシチミ. Security_MainTableSummary ユ篋アクフ盪ゥチヒシクラ鯀リヨニ, トワモーマ POPFile ユフ袮鯲ャオトーイネォ, ハヌキメェラヤカッシイ魑フミクミツ, メヤシーハヌキメェーム POPFile ミァトワヘウシニハセンオトメサー耙ナマ「エォサリウフミラユ゚オトヨミムハセンソ. Advanced_MainTableSummary ユ篋アクフ盪ゥチヒメサキン POPFile キヨタ獗ハシムカマ「ハアヒサ蘯ツヤオトラヨエハヌ蠏・, メホェヒテヌヤレメサー耨ハシムカマ「タオトケリチェケモレニオキア. ヒテヌサ盂サーエユユラヨエハソェヘキオトラヨトカアサヨチミユタ. Imap_Bucket2Folder '%s' モハヘイオトミナシヨチモハシマサ Imap_MapError ト羇サトワームウャケメサクオトモハヘイカヤモヲオスオ・メサオトモハシマサタ! Imap_Server IMAP キホニヨサテウニ: Imap_ServerNameError ヌハ菠キホニオトヨサテウニ! Imap_Port IMAP キホニチャスモイコ: Imap_PortError ヌハ菠モミミァオトチャスモイココナツ! Imap_Login IMAP ユハコナオヌネ: Imap_LoginError ヌハ菠ハケモテユ゚/オヌネテウニ! Imap_Password IMAP ユハコナオトソレチ: Imap_PasswordError ヌハ菠メェモテモレキホニオトソレチ! Imap_Expunge エモアサシ猝モオトミナシマサタヌ蟲メムアサノセウオトモハシムカマ「. Imap_Interval クミツシ荳テハ: Imap_IntervalError ヌハ菠ス鰌レ 10 テヨチ 3600 テシ莊トシ荳. Imap_Bytelimit テソキ簽ハシムカマ「メェモテタエキヨタ犒トラヨスレハ. ハ菠 0 (ソユ) アハセヘユオトモハシムカマ「: Imap_BytelimitError ヌハ菠ハヨオ. Imap_RefreshFolders ヨリミツユタモハシマサヌ蠏・ Imap_Now マヨヤレ! Imap_UpdateError1 ボキィオヌネ. ヌム鰒、ト羞トオヌネテウニクソレチ. Imap_UpdateError2 チャスモヨチキホニハァーワ. ヌシイ鰒サテウニクチャスモイコ, イ「ヌネキネマト耻ヤレマ゚ノマ. Imap_UpdateError3 ヌマネラ鯲ャチェサマクスレ. Imap_NoConnectionMessage ヌマネラ鯲ャチェサマクスレ. オアト耋ウノコ, ユ簫サメウタセヘサ盖マヨクカ狒ノモテオトム。マ. Imap_WatchMore アサシ猝モモハシマサヌ蠏・オトモハシマサ Imap_WatchedFolder アサシ猝モオトモハシマサア犲ナ Imap_Use_SSL ハケモテ SSL Shutdown_Message POPFile メムセュアサヘ」オチヒ Help_Training オアト羌エホハケモテ POPFile ハア, ヒノカメイイサカョカミ靨ェアサシモメヤオスフ. POPFile オトテソメサクモハヘイカシミ靨ェモテモハシムカマ「タエシモメヤオスフ, オoモミオアト聊リミツームトウクアサ POPFile エホキヨタ犒トモハシムカマ「ヨリミツキヨタ犒スユネキオトモハヘイハア, イナユ豬トハヌヤレオスフヒ. ヘャハアト耡イオテノ雜ィト羞トモハシモテサァカヒウフミ, タエーエユユ POPFile オトキヨタ狄盪シモメヤケツヒモハシムカマ「. ケリモレノ雜ィモテサァカヒケツヒニオトミナマ「ソノメヤヤレ POPFile ホトシシニサュタアサユメオス. Help_Bucket_Setup POPFile ウチヒ "ホエキヨタ (unclassified)" オトシルモハヘイヘ, サケミ靨ェヨチノルチスクモハヘイ. カ POPFile オトカタフリヨョエヲユヤレモレヒカヤオ釋モモハシオトヌキヨクハ、モレエヒ, ト翹ヨチソノメヤモミネホメ簗チソオトモハヘイ. シオ・オトノ雜ィサ睫ヌマ "タャサ (spam)", "クネヒ (personal)", コヘ "ケ、ラ (work)" モハヘイ. Help_No_More アヤルマヤハセユ篋ヒオテチヒ popfile-1.1.3+dfsg/languages/Catala.msg0000664000175000017500000007102611624177330017222 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # 2005/08/09 Translated by David Gimeno i Ayuso # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode ca LanguageCharset ISO-8859-1 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage en # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply Aplicar On Actiu Off Inactiu TurnOn Activar TurnOff Desactivar Add Afegir Remove Suprimir Previous Anterior Next Segent From Des de Subject Assumpte Cc Cpia Classification Cistella Reclassify Reclassificar Probability Probabilitat Scores Barems QuickMagnets Imants r瀾ids Undo Desfer Close Tancar Find Cercar Filter Filtre Yes S No No ChangeToYes Canviar a S ChangeToNo Canviar a No Bucket Cistella Magnet Imant Delete Esborrar Create Crear To A Total Total Rename Redenominar Frequency Freq鈩cia Probability Probabilitat Score Barem Lookup Examinar Word Mot Count Comptador Update Actualitzar Refresh Recarregar FAQ PMF ID ID Date Data Arrived Rebut Size Tamany # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands . Locale_Decimal ' # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %d/%m %R%Z | %e/%L/%Y %R%Z # The header and footer that appear on every UI page Header_Title Centre de control POPFile Header_Shutdown Aturar POPFile Header_History Histric Header_Buckets Cistelles Header_Configuration Configuraci Header_Advanced Avan軋t Header_Security Seguretat Header_Magnets Imants Footer_HomePage P瀏ina inicial POPFile Footer_Manual Manual Footer_Forums Frums Footer_FeedMe Acaptar Footer_RequestFeature Solキlicitar millora Footer_MailingList Llista de correu Footer_Wiki Documentaci Configuration_Error1 El car瀋ter separador ha de ser-ne un de sol Configuration_Error2 El port de l'interfcie d'usuari ha de ser un nmero entre 1 i 65535 Configuration_Error3 El port que rep les connexions POP3 ha de ser un nmero entre 1 i 65535 Configuration_Error4 El tamany de p瀏ina ha de ser un nmero entre 1 i 1000 Configuration_Error5 El nombre de dies a l'histric ha de ser un nmero entre 1 i 366 Configuration_Error6 El temps d'espera de TCP ha de ser un nmero entre 10 i 1800 Configuration_Error7 El port que rep les connexions XML RPC ha de ser un nmero entre 1 i 65535 Configuration_Error8 El port intermedi SOCKS V ha de ser un nmero entre 1 i 65535 Configuration_POP3Port Port que rep les connexions POP3 Configuration_POP3Update S'ha actualitzat el port POP3 a %s; no tindr efecte fins que reinicieu el POPFile Configuration_XMLRPCUpdate S'ha actualitzat el port XML-RPC a %s; no tindr efecte fins que reinicieu el POPFile Configuration_XMLRPCPort Port que rep les connexions XML-RPC Configuration_SMTPPort Port que rep les connexions SMTP Configuration_SMTPUpdate S'ha actualitzat el port SMTP a %s; no tindr efecte fins que reinicieu el POPFile Configuration_NNTPPort Port que rep les connexions NNTP Configuration_NNTPUpdate S'ha actualitzat el port NNTP a %s; no tindr efecte fins que reinicieu el POPFile Configuration_POPFork Permetre connexions concurrents POP3 Configuration_SMTPFork Permetre connexions concurrents SMTP Configuration_NNTPFork Permetre connexions concurrents NNTP Configuration_POP3Separator Car瀋ter separador de host:port:user POP3 Configuration_NNTPSeparator Car瀋ter separador de host:port:user NNPT Configuration_POP3SepUpdate S'ha actualitzat el separador POP3 a %s Configuration_NNTPSepUpdate S'ha actualitzat el separador NNTP a %s Configuration_UI Port web d'interfcie d'usuari Configuration_UIUpdate S'ha actualitzat el port web d'interfcie d'usuari a %s; no tindr efecte fins que reinicieu el POPFile Configuration_History Nombre de missatges per p瀏ina Configuration_HistoryUpdate S'ha actualitzat el nombre de missatges per p瀏ina a %s Configuration_Days Nombre de dies a conservar l'histric Configuration_DaysUpdate S'ha actualitzat el nombre de dies d'histric a %s Configuration_UserInterface Interfcie d'usuari Configuration_Skins Aparences Configuration_SkinsChoose Trieu aparen軋 Configuration_Language Idioma Configuration_LanguageChoose Trieu idioma Configuration_ListenPorts Opcions de mduls Configuration_HistoryView Veure histric Configuration_TCPTimeout Temps d'espera connexi Configuration_TCPTimeoutSecs Temps d'espera connexi en segons Configuration_TCPTimeoutUpdate S'ha actualitzat el temps d'espera connexi a %s Configuration_ClassificationInsertion Inserci text del missatge Configuration_SubjectLine Modificaci
lnia de l'assumpte Configuration_XTCInsertion Cap軋lera
X-Text-Classification Configuration_XPLInsertion Cap軋lera
X-POPFile-Link Configuration_Logging S'est registrant Configuration_None Cap Configuration_ToScreen A pantalla Configuration_ToFile A fitxer Configuration_ToScreenFile A pantalla i fitxer Configuration_LoggerOutput Sortida usuari Configuration_GeneralSkins Aparences Configuration_SmallSkins Aparences petites Configuration_TinySkins Aparences minscules Configuration_CurrentLogFile <Descarregar fitxer de registre actual> Configuration_SOCKSServer Servidor intermedi SOCKS V Configuration_SOCKSPort Port intermedi SOCKS V Configuration_SOCKSPortUpdate S'ha actualitzat el port intermedi SOCKS V a %s Configuration_SOCKSServerUpdate S'ha actualitzat el servidor intermedi SOCKS V a %s Configuration_Fields Columnes histric Advanced_Error1 '%s' ja 駸 a la llista de mots a ignorar Advanced_Error2 Mots a ignorar nom駸 pot contenir car瀋ters alfanum鑽ics, ., _, - i @ Advanced_Error3 afegit '%s' a la llista de mots a ignorar Advanced_Error4 '%s' no 駸 a la llista de mots a ignorar Advanced_Error5 suprimit '%s' de la llista de mots a ignorar Advanced_StopWords Mots a ignorar Advanced_Message1 POPFile ignora els segents mots molt usuals: Advanced_AddWord Afegir mot Advanced_RemoveWord Suprimir mot Advanced_AllParameters Tots els par瀘etres POPFile Advanced_Parameter Par瀘etre Advanced_Value Valor Advanced_Warning Aquesta 駸 la llista completa de par瀘etres de POPFile. Nom駸 usuaris avan軋ts: canvieu-los i cliqueu Actualitzar; no se'n comprova la validesa. Els tems mostrats en negreta sn diferents dels predeterminats. Advanced_ConfigFile Fitxer de configuraci: History_Filter  (s'est mostrant nom駸 la cistella %s) History_FilterBy Filtrat per History_Search  (cercat per Des de/Assumte %s) History_Title Missatges recents History_Jump Anar a la p瀏ina History_ShowAll Mostrar-ho tot History_ShouldBe Hauria de ser History_NoFrom cap lnia Des de History_NoSubject cap lnia Assumpte History_ClassifyAs Classificar com a History_MagnetUsed Imant usat History_MagnetBecause Imant usat

Classificat com a %s degut a l'imant %s

History_ChangedTo S'ha canviat a %s History_Already Reclassificat com a %s History_RemoveAll Suprimir-ho tot History_RemovePage Suprimir p瀏ina History_RemoveChecked Suprimir marcats History_Remove Per suprimir entrades a l'histric, cliqueu History_SearchMessage Cercar Des de/Assumpte History_NoMessages Cap missatge History_ShowMagnet imantat History_Negate_Search Invertir cerca/filtre History_Magnet  (s'est mostrant nom駸 missatges classificats per imant) History_NoMagnet  (s'est mostrant nom駸 missatges no classificats per imant) History_ResetSearch Reiniciar History_ChangedClass Ara s'hauria de classificar com a History_Purge Esborrar ara History_Increase Augmentar History_Decrease Reduir History_Column_Characters Canviar l'ample de les columnes Des de, A, Cpia i Assumpte History_Automatic Autom炙ic History_Reclassified Reclassificat History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title Contrasenya Password_Enter Introduu-hi la contrasenya Password_Go Anar-hi! Password_Error1 Contrasenya incorrecta Security_Error1 El port ha de ser un nmero entre 1 i 65535 Security_Stealth Mode furtiu/Operaci del servidor Security_NoStealthMode No (mode furtiu) Security_StealthMode (Mode furtiu) Security_ExplainStats (Si s'activa, POPFile envia un cop al dia els tres segents valors a un programa a getpopfile.org: bc, el nombre total de cistelles que teniu; mc, el nombre total de missatges classificats per POPFile, i ec, el nombre total d'errors de classificaci. Aix s'emmagatzema en un fitxer i ser usat per confeccionar estadstiques d's de POPFile i com funciona de b. El meu servidor web conserva els seus fitxers de registre uns 5 dies i aleshores s'esborren; no emmagatzemo cap connexi entre estadstiques i adreces IP individuals). Security_ExplainUpdate (Si s'activa, POPFile envia un cop per dia els tres segents valors a un programa a getpopfile.org: ma, el nombre major de versi de la vostra instalキlaci POPFile; mi, el nombre menor de versi de la vostra instalキlaci POPFile, i bn, el nombre de muntatge de la vostra instalキlaci POPFile. POPFile rep una resposta en forma de gr瀁ic que surt dalt de la p瀏ina, si hi ha una versi nova disponible. El meu servidor web conserva els seus fitxers de registre uns 5 dies i aleshores s'esborren; no emmagatzemo cap connexi entre les verificacions d'actualitzaci i les adreces IP individuals). Security_PasswordTitle Contrasenya d'interfcie d'usuari Security_Password Contrasenya Security_PasswordUpdate S'ha actualitzat la contrasenya Security_AUTHTitle Servidors remots Security_SecureServer Servidor POP3 remot (SPA/AUTH o servidor intermedi transparent) Security_SecureServerUpdate S'ha actualitzat el servidor POP3 remot a %s Security_SecurePort Port POP3 remot (SPA/AUTH o servidor intermedi transparent) Security_SecurePortUpdate S'ha actualitzat el port del servidor POP3 remot a %s Security_SMTPServer Servidor de cadena SMTP Security_SMTPServerUpdate S'ha actualitzat el servidor de cadena SMTP a %s; no tindr efecte fins que reinicieu el POPFile Security_SMTPPort Port de cadena SMTP Security_SMTPPortUpdate S'ha actualitzat el port de cadena SMTP a %s; no tindr efecte fins que reinicieu el POPFile Security_POP3 Acceptar connexions POP3 de m瀲uines remotes (cal reiniciar POPFile) Security_SMTP Acceptar connexions SMTP de m瀲uines remotes (cal reiniciar POPFile) Security_NNTP Acceptar connexions NNTP de m瀲uines remotes (cal reiniciar POPFile) Security_UI Acceptar connexions HTTP (interfcie d'usuari) de m瀲uines remotes (cal reiniciar POPFile) Security_XMLRPC Acceptar connexions XML-RPC de m瀲uines remotes (cal reiniciar POPFile) Security_UpdateTitle Comprovaci autom炙ica d'actualitzacions Security_Update Comprovar actualitzacions de POPFile di灑iament Security_StatsTitle S'estan informant les estadstiques Security_Stats Enviar les estadstiques di灑iament Magnet_Error1 Ja existeix l'imant '%s' a la cistella '%s' Magnet_Error2 El nou imant '%s' interfereix amb el '%s' de la cistella '%s' i podria donar resultats ambigus. No s'ha afegit el nou. Magnet_Error3 S'ha creat el nou imant '%s' a la cistella '%s' Magnet_CurrentMagnets Imants actuals Magnet_Message1 Els imants segents impliquen que un missatge sigui sempre encasellat a la cistella indicada Magnet_CreateNew Crear imant nou Magnet_Explanation Disposeu de tres tipus d'imants:
  • Adre軋 Des de o nom: Per exemple: john@company.com per evitar una adre軋 especfica,
    company.com per evitar tothom de company.com,
    John Doe per evitar una persona concreta, John per evitar-los tots
  • Adre軋 A/Cpia o nom: Com un imant Des de: per per a l'adressa A:/Cpia: a un missatge
  • Mots Assumpte: Per exemple: hello per evitar tots els missatges amb hello a l'assumpte
Magnet_MagnetType Tipus d'imant Magnet_Value Valors Magnet_Always Va sempre a la cistella Magnet_Jump Anar a la p瀏ina d'imants Bucket_Error1 Els noms de cistella nom駸 poden contenir lletres a a z en minscules, nmeros 0 a 9, m駸 - i _ Bucket_Error2 Ja existeix la cistella anomenada %s Bucket_Error3 S'ha creat la cistella anomenada %s Bucket_Error4 Introduu-hi algun mot Bucket_Error5 Redenominada la cistella %s a %s Bucket_Error6 Esborrada la cistella %s Bucket_Title Configuraci de cistella Bucket_BucketName Nom de
cistella Bucket_WordCount Comptador de mots Bucket_WordCounts Comptadors de mots Bucket_UniqueWords Mots
distints Bucket_SubjectModification Modificaci
cap軋lera assumpte Bucket_ChangeColor Color
cistella Bucket_NotEnoughData No hi ha prous dades Bucket_ClassificationAccuracy Precisi de la classificaci Bucket_EmailsClassified Missatges classificats Bucket_EmailsClassifiedUpper Missatges Classificats Bucket_ClassificationErrors Errors de classificaci Bucket_Accuracy Precisi Bucket_ClassificationCount Comptador de classificaci Bucket_ClassificationFP Falsos positius Bucket_ClassificationFN Falsos negatius Bucket_ResetStatistics Reiniciar estadstiques Bucket_LastReset レltima reinicialitzaci Bucket_CurrentColor El color actual de %s 駸 %s Bucket_SetColorTo S'ha canviat el color de %s a %s Bucket_Maintenance Manteniment Bucket_CreateBucket Crear una cistella de nom Bucket_DeleteBucket Esborrar la cistella anomenada Bucket_RenameBucket Redenominar la cistella anomenada Bucket_Lookup Examinar Bucket_LookupMessage Examinar la paraula a les cistelles Bucket_LookupMessage2 Examinar el resultat per Bucket_LookupMostLikely %s 駸 m駸 probable que aparegui a %s Bucket_DoesNotAppear

%s no apareix a cap de les cistelles Bucket_DisabledGlobally Globalment inhabilitat Bucket_To a Bucket_Quarantine Missatge de
quarantena SingleBucket_Title Detall de %s SingleBucket_WordCount Comptador de mots de la cistella SingleBucket_TotalWordCount Comptador total de mots SingleBucket_Percentage Percentatge del total SingleBucket_WordTable Taula de mots de %s SingleBucket_Message1 Cliqueu una lletra a l'ndex per veure la llista de mots que hi comencen. Cliqueu qualsevol mot per examinar llur probabilitat per a totes les cistelles. SingleBucket_Unique %s distint SingleBucket_ClearBucket Suprimir tots els mots Session_Title La sessi POPFile ha ven輹t Session_Error La vostra sessi POPFile ha ven輹t. Aix pot ser degut a haver aturat i iniciat POPFile deixant el vostre navegador web obert. Cliqueu un dels enlla輟s de m駸 amunt per continuar usant POPFile. View_Title Visualitzaci missatge individual View_ShowFrequencies Mostrar freq鈩cies de mot View_ShowProbabilities Mostrar probabilitats de mot View_ShowScores Mostrar barems de mot i diagrama de decisi View_WordMatrix Matriu de mots View_WordProbabilities s'estan mostrant les probabilitats de mot View_WordFrequencies s'estan mostrant les freq鈩cies de mot View_WordScores s'estan mostrant els barems de mot View_Chart Diagrama de decisi Windows_TrayIcon Mostrar la icona POPFile a la safata de sistema del Windows? Windows_Console Executar POPFile a una finestra de consola? Windows_NextTime

No tindr efecte fins que reinicieu el POPFile Header_MenuSummary Aquesta taula 駸 el men de navegaci que permet d'accedir a cadascuna de les diferents p瀏ines del centre de control. History_MainTableSummary Aquesta taula mostra el remitent i l'assumpte dels missatges rebuts ad駸 i permet de revisar-los i reclassificar-los. En clicar la lnia de l'assumpte es mostrar el missatge sencer, juntament amb la informaci del per qu de llur classificaci. La columna 'Hauria de ser' us permet d'especificar a quina cistella pertany o de desfer aquest canvi. La columna 'Esborrar' us permet d'esborrar de l'histric missatges especfics, si ja no els necessiteu. History_OpenMessageSummary Aquesta taula cont el text complet d'un missatge, amb els mots usats a la classificaci ressaltats segons la cistella m駸 rellevant de cadascun. Bucket_MainTableSummary Aquesta taula proporciona una ullada de les cistelles de classificaci. Cada fila mostra per a cada cistella el nom, el comptador total de mots, el nombre total de mots individuals, si es modificar la lnia d'assumpte en classificar-lo, si es deixaran en quarantena els que es rebin i una taula per seleccionar el color a usar en presentar al centre de control res de relacionat amb ella. Bucket_StatisticsTableSummary Aquesta taula proporciona tres jocs d'estadstiques sobre el rendiment general de POPFile. El primer 駸 com d'acurada 駸 la classificaci, el segon quants missatges i a quines cistelles s'han classificat i el tercer quants mots hi ha a cada cistella i quins percentatges representen. Bucket_MaintenanceTableSummary Aquesta taula cont formularis que us permeten de crear, esborrar o redenominar cistelles o examinar un mot a totes les cistelles per veure quines probabilitats presenta. Bucket_AccuracyChartSummary Aquesta taula representa gr瀁icament la precisi de la classificaci de missatges. Bucket_BarChartSummary Aquesta taula representa gr瀁icament l'assignaci de percentatges a cadascuna de les diferents cistelles. S'usa tant per al nombre de missatges classificats com per als comptadors totals de mots. Bucket_LookupResultsSummary Aquesta taula mostra les probabilitats associades a un mot del corpus donat. De cada cistella mostra la freq鈩cia en que esdev el mot, la probabilitat de que hi aparegui i l'efecte general que t sobre el barem de la cistella si n'hi ha cap en un missatge. Bucket_WordListTableSummary Aquesta taula proporciona una llista de tots els mots d'una cistella particular, ordenats per la primera lletra com a cada fila. Magnet_MainTableSummary Aquesta taula mostra la llista d'imants que s'usen per classificar missatges autom炙icament segons unes regles fixes. Cada fila mostra com es defineix l'imant, per a quina cistella s'ha fet i un bot per esborrar-lo. Configuration_MainTableSummary Aquesta taula cont un nombre de formularis que us permeten de controlar la configuraci de POPFile. Configuration_InsertionTableSummary Aquesta taula cont els botons que determinen si es fan certes modificacions a les cap軋leres o lnia d'assumpte del missatge abans no sigui passat al client de correu, o no. Security_MainTableSummary Aquesta taula proporciona jocs de controls que afecten la seguretat de la configuraci general de POPFile, si s'ha de comprovar autom炙icament si hi ha actualitzacions del programa i si s'han enviar les estadstiques sobre rendiment del POPFile al magatzem central de l'autor del programa per a informaci general. Advanced_MainTableSummary Aquesta taula proporciona una llista de mots que POPFile ignora en classificar els missatges atesa llur freq鈩cia relativa als missatges de tota mena. S'ordenen per fila segons llur primera lletra. Imap_Bucket2Folder Els correus de la cistella %s van a la carpeta Imap_MapError No podeu assignar m駸 d'una cistella a una sola carpeta! Imap_Server Nom del servidor IMAP: Imap_ServerNameError Introduu-hi el nom del servidor! Imap_Port Port del servidor IMAP: Imap_PortError Introduu-hi un nmero de port v瀝id! Imap_Login Nom del compte IMAP: Imap_LoginError Introduu-hi un nom d'usuari! Imap_Password Contrasenya del compte IMAP: Imap_PasswordError Introduu-hi una contrasenya pel servidor! Imap_Expunge Destruir de les carpetes mirades els missatges esborrats. Imap_Interval Interval d'actualitzaci, en segons: Imap_IntervalError Introduu-hi un interval entre 10 i 3600 segons. Imap_Bytelimit Nombre de bytes per missatge a usar per a la classificaci. Introduu-hi 0 (zero) pel missatge complet: Imap_BytelimitError Introduu-hi un nombre. Imap_RefreshFolders Recarregar la llista de carpetes Imap_Now ara! Imap_UpdateError1 No s'ha pogut entrar. Verifiqueu el nom del compte i la contrasenya. Imap_UpdateError2 No s'ha pogut connectar amb el servidor. Comproveu el nom i el port del servidor i assegureu-vos que sou en lnia. Imap_UpdateError3 Configureu abans els detalls de la connexi. Imap_NoConnectionMessage Configureu abans els detalls de la connexi. Despr駸 que hi hagueu fet, hi haur m駸 opcions disponibles. Imap_WatchMore una carpeta a la llista de les carpetes mirades Imap_WatchedFolder Carpeta mirada nm. Shutdown_Message S'ha aturat el POPFile Help_Training Quan useu per primer cop POPFile, no sap res i caldr una mica d'entrenament. Cal entrenar POPFile per a cada cistella. L'anireu educant cada cop que reclassifiqueu un missatge que POPFile hagi classificat a una cistella incorrecta. Tamb haureu de configurar el vostre client de correu perqu filtri els missatges segons la classificaci de POPFile. Podeu trobar informaci sobre com configurar el filtratge del vostre client de correu a Projecte de Documentaci POPFile (en angl鑚). Help_Bucket_Setup POPFile necessita al menys dues cistelles a m駸 de la pseudo-cistella 'unclassified'. El que fa nic POPFile 駸 que pot classificar els correus en tantes cistelles com volgueu. Una configuraci senzilla pot ser una cistella "spam", una "personal" i una altra "feina". Help_No_More No mostrar-m'ho m駸 popfile-1.1.3+dfsg/languages/Bulgarian.msg0000664000175000017500000004522711624177330017745 0ustar danieldaniel# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode bg LanguageCharset Windows-1251 LanguageDirection ltr # This is used to get the appropriate subdirectory for the manual ManualLanguage bg # Common words that are used on their own all over the interface Apply マ褊 On ツ. Off ネ鉤. TurnOn ツ TurnOff ネ鉤 Add ト矜粨 Remove マ褌瑾 Previous マ裝. Next ム裝. From ホ Subject ヌ璢珞韃 Classification ハ瑰頡韭璋 Reclassify マ裲瑰頡. Undo ツ Close ヌ瑣粽 Find メ Filter ヤ齏 Yes ト No ヘ ChangeToYes ヘ瑜珞 トタ ChangeToNo ヘ瑜珞 ヘナ Bucket ハ Magnet フ璢頸 Delete ネ銓韜 Create ム鈕琺 To ト Total ホ碼 Rename マ裴褊籵 Frequency ラ褥 Probability ツ褞 Score ホ褊 Lookup メ # The header and footer that appear on every UI page Header_Title マ瑙褄 鈞 珞褊韃 POPFile Header_Shutdown ム POPFile Header_History ユ韭 Header_Buckets ハ粢 Header_Configuration ハ鞳璋 Header_Advanced ム褻鞨 Header_Security ヌ瓊頸 Header_Magnets フ璢頸 Footer_HomePage Web 瑙頽 POPFile Footer_Manual ミ粽蓴粽 Footer_Forums ヤ Footer_FeedMe ト瑩褊韃 Footer_RequestFeature ネ蒟 Footer_MailingList タ碚瑟褊 Configuration_Error1 ツ粢蒟 鈞 珸蒟頸褄 裝竟-裝竟粢 鈿瑕 Configuration_Error2 マ 鈞 裔頸褄 竟褞裨 矮 萵 磅蒟 頌 褂蔘 1 65535 Configuration_Error3 ミ珮 鈞 POP3 矮 萵 磅蒟 頌 褂蔘 1 65535 Configuration_Error4 ミ珸褞 瑙頽瑣 矮 萵 磅蒟 頌 褂蔘 1 1000 Configuration_Error5 チ 蓖 韭瑣 矮 萵 磅蒟 頌 褂蔘 1 366 Configuration_Error6 TCP 琺瑪 矮 萵 磅蒟 頌 褂蔘 10 1800 Configuration_POP3Port ミ珮褊 鈞 POP3 Configuration_POP3Update ミ珮 褊褊 %s; 珸 珸 裝籵 瑩頏瑙 POPFile. Configuration_Separator ミ珸蒟頸褄 Configuration_SepUpdate ミ珸蒟頸褄 褊褊 %s Configuration_UI マ 鈞 裔頸褄 竟褞裨 Configuration_UIUpdate マ 鈞 裔頸褄 竟褞裨 褊褊 %s; 珸 珸 裝籵 瑩頏瑙 POPFile. Configuration_History チ 碼褊 瑙頽 Configuration_HistoryUpdate チ 碼褊 瑙頽 褊褊 %s Configuration_Days チ 蓖 鈞 珸褊 韭 Configuration_DaysUpdate チ 蓖頸 鈞 珸褊 韭 褊褊 %s Configuration_UserInterface マ裔頸褄 竟褞裨 Configuration_Skins Skins Configuration_SkinsChoose Choose skin Configuration_Language ナ鉅 Configuration_LanguageChoose ネ釿褞 裼韭 Configuration_ListenPorts マ粢 Configuration_HistoryView ツ鞴 韭瑣 Configuration_TCPTimeout TCP メ琺瑪 Configuration_TCPTimeoutSecs メ琺瑪 TCP 糅鉤頸 裲蒻 Configuration_TCPTimeoutUpdate TCP 琺瑪 褊褊 %s Configuration_ClassificationInsertion ホ碚鈿璞珞瑙 瑰頡韭璋 Configuration_SubjectLine マ 鈞肭珞韃 Configuration_XTCInsertion ツ籵 X-Text-Classification Configuration_XPLInsertion ツ籵 X-POPFile-Link Configuration_Logging マ頏瑙 Configuration_None チ裼 Configuration_ToScreen ヘ 裲瑙 Configuration_ToFile ツ 琺 Configuration_ToScreenFile ツ 琺 裲瑙 Configuration_LoggerOutput フ 鈞 頏瑙 Configuration_GeneralSkins Skins Configuration_SmallSkins Small Skins Configuration_TinySkins Tiny Skins Advanced_Error1 '%s' 粢 頌籵 頌 鞳頏瑙頸 蔘 Advanced_Error2 ネ肬頏瑙頸 蔘 趺 萵 蕣赳 瑟 碯粨, 頡 鈿璋頸 ., _, -, 齏 @ Advanced_Error3 '%s' 蒡矜粢 頌 鞳頏瑙 蔘 Advanced_Error4 '%s' 頌籵 頌 鞳頏瑙頸 蔘 Advanced_Error5 '%s' 褌瑾瑣 頌 鞳頏瑙 蔘 Advanced_StopWords ネ肬頏瑙 蔘 Advanced_Message1 ム裝頸 蔘 鞳頏瑣 瑰頡頽頏瑙, 瑣 襌瑣 糶蒟 褥. Advanced_AddWord ト矜粨 蔘 Advanced_RemoveWord マ褌瑾 蔘 History_Filter  (珸瑙 瑟 %s) History_FilterBy Filter By History_Search  (褊 鈞 鈞肭珞韃 %s) History_Title マ裝 碼褊 History_Jump マ襄 碼褊韃 History_ShowAll マ琥 糂顆 History_ShouldBe メ矮 萵 磅蒟 History_NoFrom ヘ 萵褄 History_NoSubject ヘ 鈞肭珞韃 History_ClassifyAs ハ瑰頡頽頏琺 瑣 History_MagnetUsed ム裝 璢頸 History_ChangedTo マ褊褊 %s History_Already ツ褶 瑰頡頽頏瑙 瑣 %s History_RemoveAll マ褌瑾 糂顆 History_RemovePage マ褌瑾 珸 瑙頽 History_Remove ヌ 褌瑾籵 碼褊 瑣頌: History_SearchMessage メ 萵褄 鈞肭珞韃 History_NoMessages ヘ 碼褊 History_ShowMagnet マ 璢頸 History_Magnet  (瑟 瑰頡頽頏瑙頸 璢頸) History_ResetSearch ネ銷頌 褊褪 Password_Title マ瑩 Password_Enter ツ粢蒻 瑩 Password_Go ホハ Password_Error1 ヘ裘琿鞴 瑩 Security_Error1 マ 裙頸韲頏瑙 矮 萵 磅蒟 頌 褂蔘 1 65535 Security_Stealth ム頸 褂韲 Security_NoStealthMode ヘ (頸 褂韲) Security_ExplainStats (ハ聰 籵 粲褊, POPFile 粢蓖 蓖裘 韈瓊 韵 getpopfile.org: bc (碣 粢), mc (碣 碼褊, 瑰頡頽頏瑙 POPFile) ec (碣 胙褸 瑰頡頽頏瑙頸 碼褊). メ裼 鳫 瑙籵 糶 琺 硴璢萵褊韃 珸 硴韭籵 瑣頌韭 鈞 璞竟, 鶯 瑣 韈鈔瑣 POPFile 蒡碣 珮. フ Web 糶 瑙籵 -琺粢 蕣趺韃 5 蓖, 裝 褪 肛 韈鞣; 珸 珸 糅鉤 褂蔘 瑣頌顆褥頸 萵 褪頸 IP 琅褥.) Security_ExplainUpdate (ハ聰 籵 粲褊, POPFile 粢蓖 蓖裘 韈瓊 韵 getpopfile.org: bc (碣 粢), mc (碣 碼褊, 瑰頡頽頏瑙 POPFile) ec (碣 胙褸 瑰頡頽頏瑙頸 碼褊). POPFile 珞 碣瑣 韈粢韃 萵 韲 -籵 粢 褞 珸籵 粢 瑩竟 糂 瑙頽. フ Web 糶 瑙籵 -琺粢 蕣趺韃 5 蓖, 裝 褪 肛 韈鞣; 珸 珸 糅鉤 褂蔘 鈞頸籵 鈞 籵 粢 褪頸 IP 琅褥.) Security_PasswordTitle マ瑩 鈞 裔頸褄 竟褞裨 Security_Password マ瑩 Security_PasswordUpdate マ瑩瑣 褊褊 %s Security_AUTHTitle ヒ裙頸韲璋 裝 糶/AUTH Security_SecureServer ム糶, 韈頌籵 裙頸韲璋 Security_SecureServerUpdate ム糶 裴韲璋 褊 %s; 珸 磅蒟 珸褊 裝籵 瑩頏瑙 POPFile Security_SecurePort マ 鈞 裙頸韲璋 Security_SecurePortUpdate マ 褊褊 %s; 珸 磅蒟 珸褊 裝籵 瑩頏瑙 POPFile Security_POP3 マ韃瑙 POP3 糅鉤 蓿肛 璧竟 Security_UI マ韃瑙 HTTP 糅鉤 (鈞 裔頸褄 竟褞裨) 蓿肛 璧竟 Security_UpdateTitle タ糘瑣顆 粢 鈞 粨 粢韋 Security_Update ナ趺蓖裘 粢 鈞 粨 粢韋 POPFile Security_StatsTitle ム礪瑙 瑣頌韭 Security_Stats ナ趺蓖裘 韈瓊瑙 瑣頌顆褥 萵 珞 Magnet_Error1 フ璢頸 '%s' 粢 鈞萵蒟 鈞 '%s' Magnet_Error2 ヘ粨 璢頸 '%s' 鞣褶 璢頸 '%s' 鈞 '%s' 趺 萵 裝韈粨 裹蓖鈿璞; 璢頸 蒡矜粢. Magnet_Error3 ム鈕琺 璢頸 '%s' 鈞 '%s' Magnet_CurrentMagnets フ璢頸 Magnet_Message1 ム裝頸 璢頸 赳 鈞 裼珮珞 瑰頡頽頏瑙 碼褊 萵蒟 . Magnet_CreateNew ム鈕琺 璢頸 Magnet_Explanation ネ 粨萵 璢頸:

  • タ蓿褥 齏 韲 萵褄: ヘ瑜韲褞: john@company.com 鈞 褪褊 琅褥,
    company.com 鈞 糂顆 琅褥 company.com,
    John Doe 鈞 褪褊 萵褄, John 鈞 糂顆 John-鬻
  • タ蓿褥 齏 韲 瑣褄: マ蒡硼 琅褥 萵褄, 鈞 琅褥 瑣褄 碼褊韃
  • ト 鈞肭珞韃: ヘ瑜韲褞: hello 鈞 糂顆 碼褊, 韃 鈞肭珞韃 蕣赳 hello
Magnet_MagnetType メ韵 璢頸 Magnet_Value ム鳫 Magnet_Always ハ瑰頡頽頏琺 粨璢 Bucket_Error1 ネ褊瑣 粢 趺 萵 蕣赳 瑟 琿 瑣竟 碯粨 a 蒡 z 鈿璋頸 - _ Bucket_Error2 ツ褶 褥糒籵 %s Bucket_Error3 ム鈕琅褊 %s Bucket_Error4 フ 糶粢蒟 襌 Bucket_Error5 ハ %s 裴褊籵 %s Bucket_Error6 ネ銓頸 %s Bucket_Title ム瑣頌韭 Bucket_BucketName ハ Bucket_WordCount チ 蔘 Bucket_WordCounts チ 蔘 Bucket_UniqueWords モ韭琿 蔘 Bucket_SubjectModification マ 鈞肭珞韃 Bucket_ChangeColor マ褊 粢 Bucket_NotEnoughData ヘ裝瑣 萵 Bucket_ClassificationAccuracy メ 瑰頡韭璋 Bucket_EmailsClassified ハ瑰頡頽頏瑙 碼褊 Bucket_EmailsClassifiedUpper ハ瑰頡頽頏瑙 碼褊 Bucket_ClassificationErrors テ褸 瑰頡韭璋 Bucket_Accuracy メ Bucket_ClassificationCount チ 瑰頡頽頏瑙 Bucket_ResetStatistics ヘ頏琺 瑣頌韭瑣 Bucket_LastReset マ裝 頏瑙 Bucket_CurrentColor ツ 褊 粢 鈞 %s %s Bucket_SetColorTo マ褊 粢 鈞 %s %s Bucket_Maintenance マ褊 Bucket_CreateBucket ム鈕琺 韲 Bucket_DeleteBucket ネ銓韜 韲 Bucket_RenameBucket マ裴褊籵 韲 Bucket_Lookup メ褊 Bucket_LookupMessage メ褊 蔘 粢 Bucket_LookupMessage2 ミ裼瑣 褊褪 Bucket_LookupMostLikely %s 琺-褥 襌 %s Bucket_DoesNotAppear

%s 頌籵 韭 Bucket_DisabledGlobally ネ鉤褊 鈞 糂顆 Bucket_To Bucket_Quarantine ハ瑩瑙竟 SingleBucket_Title ト褪琺 鈞 %s SingleBucket_WordCount チ 蔘 SingleBucket_TotalWordCount ホ碼 蔘 SingleBucket_Percentage マ褊 碼 碣 SingleBucket_WordTable ト, 琅瓊 %s SingleBucket_Message1 ホ鈿璞褊頸 鈔裼蒻 (*) 蔘 韈鈔瑙 鈞 瑰頡韭璋 籵 瑙 POPFile. ル瑕褪 顏瑣 蔘, 鈞 萵 粨蒻 粢 鈞 琅瑙褪 糶 糂顆 粢. SingleBucket_Unique %s 韭琿 Session_Title ム裄 珮 POPFile 韭齏 Session_Error ツ璧 裄 珮 POPFile 韭齏. メ籵 趺 萵 齏 頏瑙 瑙 POPFile 珞褊 粽褊 鉋褻 碣瑪鈑. ル瑕褪 胛頸 糅鉤, 鈞 萵 蕣跖 珮 POPFile. Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of PopFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of PopFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of PopFile, whether it should automatically check for updates to the program, and whether statistics about PopFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that PopFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. popfile-1.1.3+dfsg/languages/Arabic.msg0000664000175000017500000010061711624177330017215 0ustar danieldanielサソ# Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Identify the language and character set used for the interface LanguageCode ar LanguageCharset utf-8 LanguageDirection rtl # This is used to get the appropriate subdirectory for the manual ManualLanguage ar # This is where to find the FAQ on the Wiki FAQLink FAQ # Common words that are used on their own all over the interface Apply リェリキリィル館 On ルリエリキ Off ルルほル TurnOn ルリエル滞キ TurnOff リ・ルほル Add リ」リカル Remove リ・リュリール Previous リァルリウリァリィル Next リァルリェリァルル From ルル証アリウル Subject ルル畏カル畏ケ Cc ルリウリョリゥ リョルル韓ゥ (Cc) Classification リェリオルル館 Reclassify リ」リケリッ リァルリェリオルル館 Probability リ・リュリェルリァルル韓ゥ Scores ルリェリァリヲリャ QuickMagnets ルリコルリァリキル韓ウ リウリアル韓ケ Undo リェリアリァリャリケ Close リ」リコルル Find リ・リィリュリォ Filter リオルル胎 Yes ルリケル No ルリァ ChangeToYes リコル館滞ア リァルル ルリケル ChangeToNo リコル館滞ア リァルル ルリァ Bucket リッルル Magnet ルリコルリァリキル韓ウ Delete リ・リュリール Create リ・リオルリケ To ルリウリェルぺィル Total リ・リャルリァルル Rename リ」リケリァリッリゥ リェリウルル韓ゥ Frequency リェルリアリァリア Probability リ・リュリェルリァルル韓ゥ Score ルリェル韓ャリゥ Lookup リ・リィリュリォ Word ルルルリゥ Count ルリャルル畏ケ Update リェリュリッル韓ォ Refresh リェリュリッル韓ォ FAQ リ」リウリヲルリゥ リエリァリヲリケリゥ ID ID Date リェリァリアル韓ョ Arrived ル畏オル異 Size リュリャル # This is a regular expression pattern that is used to convert # a number into a friendly looking number (for the US and UK this # means comma separated at the thousands) Locale_Thousands , Locale_Decimal . # The Locale_Date uses the format strings in Perl's Date::Format # module to set the date format for the UI. There are two possible # ways to specify it. # # Just one simple format used for all dates # < | The first format is used for dates less than # 7 days from now, the second for all other dates Locale_Date %a %R | %D %R # The header and footer that appear on every UI page Header_Title ルリアルリイ リェリュルル POPFile Header_Shutdown リ・ルルリァリ。 リァルリィリアルリァルリャ Header_History ルリュルル畏クリァリェ Header_Buckets リッルリァリ。 Header_Configuration リ・リケリッリァリッリァリェ Header_Advanced リョル韓ァリアリァリェ ルリェルぺッルリゥ Header_Security リァルリ」ルリァル Header_Magnets ルリコルリァリキル韓ウ Footer_HomePage リオルリュリゥ リァルリィリッリァル韓ゥ Footer_Manual リェリケルル館リァリェ Footer_Forums ルルリェリッル Footer_FeedMe リェリィリアル滞ケ Footer_RequestFeature リ」リキルリィ ルル韓イリゥ Footer_MailingList ルリャルル畏ケリゥ リィリアル韓ッル韓ゥ Footer_Wiki ル畏ォリァリヲル Configuration_Error1 リュリアル リァルルリオル ル韓ュリィ リ」ル ル館ル異 ルルリアリッリァル Configuration_Error2 リィル畏ァリィリゥ リァルリ・リェリオリァル ルル畏ァリャルリゥ リァルルリウリェリョリッル ル韓ャリィ リ」ル リェルル異 リアルほリァル リィル館 1 ル 65535 Configuration_Error3 リィル畏ァリィリゥ リァルリ・リェリオリァル ルルル POP3 ル韓ャリィ リ」ル リェルル異 リアルほリァル リィル館 1 ル 65535 Configuration_Error4 リュリャル リァルリオルリュリゥ ル韓ュリィ リ」ル ル館ル異 リアルほリァル リィル館 1 ル 1000 Configuration_Error5 リケリッリッ リ」ル韓ァル リァルルリュルル畏クリァリェ ル韓ュリィ リ」ル ル館ル異 リアルほリァル リィル館 1 ル 366 Configuration_Error6 リイルル リ・ルルリァリ。 リ・リェリオリァル TCP ル韓ャリィ リ」ル ル館ル異 リアルほリァル リィル館 10 ル 1800 Configuration_Error7 リィル畏ァリィリゥ リ・リェリオリァル XML RPC ル韓ャリィ リ」ル リェルル異 リアルほリァル リィル館 1 ル 65535 Configuration_Error8 リィル畏ァリィリゥ リ・リェリオリァル Socks V ル韓ャリィ リ」ル リェルル異 リアルほリァル リィル館 1 ル 65535 Configuration_POP3Port リィル畏ァリィリゥ リ・リェリオリァル POP3 Configuration_POP3Update ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル POP3 リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Configuration_XMLRPCUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル XML-RPC リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Configuration_XMLRPCPort リィル畏ァリィリゥ リ・リェリオリァル XML-RPC Configuration_SMTPPort リィル畏ァリィリゥ リ・リェリオリァル SMTP Configuration_SMTPUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル SMTP リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Configuration_NNTPPort リィル畏ァリィリゥ リァルリァリェリオリァル リ・ルル NNTP Configuration_NNTPUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル NNTP リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Configuration_POPFork リ・リウルリュ ルリケリッリゥ リァリェリオリァルリァリェ POP3 リィリエルル ルリェリイリァルル Configuration_SMTPFork リ・リウルリュ ルリケリッリゥ リァリェリオリァルリァリェ SMTP リィリエルル ルリェリイリァルル Configuration_NNTPFork リ・リウルリュ ルリケリッリゥ リァリェリオリァルリァリェ NNTP リィリエルル ルリェリイリァルル Configuration_POP3Separator リュリアル ルリオル POP3 リィル館 host:port:user Configuration_NNTPSeparator リュリアル ルリオル NNTP リィル館 host:port:user Configuration_POP3SepUpdate リェル リェリケリッル館 リュリアル ルリオル POP3 リ・ルル %s Configuration_NNTPSepUpdate リェル リェリケリッル館 リュリアル ルリオル NNTP リ・ルル %s Configuration_UI リィル畏ァリィリゥ リァルリ・リェリオリァル ルル畏ァリャルリゥ リァルルリウリェリョリッル Configuration_UIUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル ル畏ァリャルリゥ リァルルリウリェリョリッル リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Configuration_History リケリッリッ リァルリアリウリァリヲル ルル ルル リオルリュリゥ Configuration_HistoryUpdate ルルぺッ リェル リェリケリッル館 リケリッリッ リァルリアリウリァリヲル ルル ルル リオルリュリゥ リ・ルル %s Configuration_Days リケリッリッ リ」ル韓ァル リァルルリュルル畏クリァリェ ルルリ・リィルぺァリ。 Configuration_DaysUpdate ルルぺッ リェル リェリケリッル館 リケリッリッ リ」ル韓ァル リァルルリュルル畏クリァリェ ルルリ・リィルぺァリ。 リ・ルル %s Configuration_UserInterface ル畏ァリャルリゥ リァルルリウリェリョリッル Configuration_Skins リウルリゥ リァルル畏ァリャルリゥ Configuration_SkinsChoose リ・リョリェリア リウルリゥ リァルル畏ァリャルリゥ Configuration_Language ルリコリゥ Configuration_LanguageChoose リ・リョリェリア リァルルリコリゥ Configuration_ListenPorts リァリョリェル韓ァリアリァリェ リァルリィル証アル館リャ Configuration_HistoryView リケリアリカ リァルルリュルル畏クリァリェ Configuration_TCPTimeout リイルル リ・ルルリァリ。 リァルリ・リェリオリァル Configuration_TCPTimeoutSecs リイルル リ・ルルリァリ。 リァルリ・リェリオリァル (リォル畏ァル) Configuration_TCPTimeoutUpdate リェル リェリケリッル館 リイルル リ・ルルリァリ。 リァルリ・リェリオリァル リ・ルル %s Configuration_ClassificationInsertion リ・リカリァルリゥ リ・ルル ルリオ リアリウリァルリゥ Configuration_SubjectLine リェリケリッル館
リウリキリア リァルルル畏カル畏ケ Configuration_XTCInsertion リアリ」リウル韓ゥ
X-Text-Classification Configuration_XPLInsertion リアリ」リウル韓ゥ
X-POPFile-Link Configuration_Logging リウリャルリァリェ Configuration_None リィルリァ Configuration_ToScreen リ・ルル リァルリエリァリエリゥ Configuration_ToFile リ・ルル ルルル Configuration_ToScreenFile リ・ルル リァルリエリァリエリゥ ル異ルル Configuration_LoggerOutput ルリァリェリャ リァルリウリャル Configuration_GeneralSkins リウルリゥ リァルル畏ァリャルリゥ Configuration_SmallSkins リウルリァリェ リオリコル韓アリゥ Configuration_TinySkins リウルリァリェ リオリコル韓アリゥ リャリッリァル Configuration_CurrentLogFile <ルルル リァルリウリャル リァルリュリァルル> Configuration_SOCKSServer ルルルほ ル異ル館 リョリァリッル SOCKS V Configuration_SOCKSPort リィル畏ァリィリゥ リ・リェリオリァル ルルルほ ル異ル館 SOCKS V Configuration_SOCKSPortUpdate リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル ルルルほ ル異ル館 SOCKS V リ・ルル %s Configuration_SOCKSServerUpdate リェル リェリケリッル館 リョリァリッル ルルルほ ル異ル館 SOCKS V リ・ルル %s Configuration_Fields リ」リケルリッリゥ リァルルリュルル畏クリァリェ Advanced_Error1 '%s' ルル畏ャル畏ッリゥ ルリウリィルぺァル ルル ルリァリヲリュリゥ リァルルルルリァリェ リァルルルルルリゥ Advanced_Error2 リァルルルルリァリェ リァルルルルルリゥ ル館ルル リ」ル リェリュリェル異 ルルぺキ リァリュリアル リ」ル リァリアルぺァル リ」ル . リ」ル _ リ」ル - リ」ル @ Advanced_Error3 ルルぺッ リェル リ・リカリァルリゥ '%s' リ・ルル ルリァリヲリュリゥ リァルルルルリァリェ リァルルルルルリゥ Advanced_Error4 '%s' ルル韓ウリェ ルル ルリァリヲリュリゥ リァルルルルリァリェ リァルルルルルリゥ Advanced_Error5 ルルぺッ リェル リ・リイリァルリゥ '%s' ルル ルリァリヲリュリゥ リァルルルルリァリェ リァルルルルルリゥ Advanced_StopWords ルルルリァリェ ルルルルリゥ Advanced_Message1 POPFile ル館ルル リァルルルルリァリェ リァルリエリァリヲリケリゥ リァルリ・リウリェリケルリァル リァルリェリァルル韓ゥ: Advanced_AddWord リ」リカル ルルルリゥ Advanced_RemoveWord リ・リュリール ルルルリゥ Advanced_AllParameters ルリァルリゥ ルリケリァル館韓ア POPFile Advanced_Parameter ルリケル韓ァリア Advanced_Value ルほ館リゥ Advanced_Warning ルリール ルぺァリヲルリゥ ルリァルルリゥ リィルリァルリゥ ルリケリァル館韓ア POPFile. ルルルリウリェリョリッルル館 リァルルリュリェリアルル館 ルルぺキ: ル館ルルルル リェリコル館韓ア リ」ル ルほ館リゥ ル異ル リォル リァルリカリコリキ リケルル "リェリュリッル韓ォ"リ ルリァ ル館畏ャリッ リェリッルほ館 リケルル リオリュリゥ リァルルリケルル異リァリェ. Advanced_ConfigFile ルルル リァルリ・リケリッリァリッリァリェ: History_Filter  (リケリアリカ リァルリッルル %s) History_FilterBy リオルル胎 リケルル History_Search  (リャリアル リァルリィリュリォ リケル ルル証アリウル/ルル畏カル畏ケ %s) History_Title リアリウリァリヲル リュリッル韓ォリゥ History_Jump リ・リールリィ リァルル リオルリュリゥ History_ShowAll リ・リケリアリカ リァルルル History_ShouldBe ル館リカル胎 リ」ル ル館ル異 History_NoFrom ルリァ ル館畏ャリッ リウリキリア "from" History_NoSubject ルリァ ル館畏ャリッ リウリキリア "subject" History_ClassifyAs リオルル胎 ルリォル History_MagnetUsed ルリコルリァリキル韓ウ ルリウリェリケルル History_MagnetBecause ルリコルリァリキル韓ウ ルリウリェリケルル

リオルル リ・ルル %s リィリウリィリィ リァルルリコルリァリキル韓ウ %s

History_ChangedTo リェル リェリコル韓アル リ・ルル %s History_Already リ」リケル韓ッ リェリオルル館ル リ・ルル %s History_RemoveAll リュリール リァルルル History_RemovePage リュリール リァルリオルリュリゥ History_RemoveChecked リュリール リァルルリョリェリァリア History_Remove ルリュリール ルリッリョルリァリェ ルル リァルルリュルル畏クリァリェ リ・リカリコリキ History_SearchMessage リ・リィリュリォ ルリアリウル/ルル畏カル畏ケ History_NoMessages ルリァ リェル畏ャリッ リアリウリァリヲル History_ShowMagnet ルルリコルリキ History_Negate_Search リ」リケルリウ リァルリィリュリォ/リァルリェリオルル館 History_Magnet  (リケリアリカ リァルリアリウリァリヲル リァルルリオルルリゥ ルリコルリァリキル韓ウル韓ァル ルルぺキ) History_NoMagnet  (リケリアリカ リァルリアリウリァリヲル リコル韓ア リァルルリオルルリゥ ルリコルリァリキル韓ウル韓ァル ルルぺキ) History_ResetSearch リェリオルル韓ア リァルリィリュリォ History_ChangedClass リウル韓ェル リェリオルル館ル リァルリ「ル ルルリァ History_Purge リ・リュリール リァルリ「ル History_Increase リイル切ッ History_Decrease リョルル滞カ History_Column_Characters ルほ リィリェリコル館韓ア リケリアリカ リ」リケルリッリゥ ルリアリウルリ ルリウリェルぺィルリ Ccリ ルル畏カル畏ケ History_Automatic リェルルぺァリヲル History_Reclassified リ」リケル韓ッ リェリオルル館ほ History_Size_Bytes %d B History_Size_KiloBytes %.1f KB History_Size_MegaBytes %.1f MB Password_Title ルルルリゥ リァルルリアル畏ア Password_Enter リ」リッリョル ルルルリゥ リァルルリアル畏ア Password_Go リ」リッリョル Password_Error1 ルルルリゥ リァルルリアル畏ア リョリァリキリヲリゥ Security_Error1 リァルリィル畏ァリィリゥ ル韓ャリィ リ」ル リェルル異 リアルほリァル リィル館 1 ル 65535 Security_Stealth ルリクリァル リァルリ・リョルリァリ。/リケルルル韓ァリェ リァルリョリァリッル Security_NoStealthMode ルリァ (ルリクリァル リァルリ・リョルリァリ。) Security_StealthMode (Stealth Mode) Security_ExplainStats (リケルリッルリァ ル館ル異 ルリケリァルリァル ル館ほ異 POPFile リィリ・リアリウリァル リァルルほ館 リァルリォルリァリォ リァルリェリァルル韓ゥ リ・ルル getpopfile.org ルリアリゥ ル畏ァリュリッリゥ ルル リァルル館異: bc (リ・リャルリァルル リケリッリッ リァルリッルリァリ。 リァルリェル リケルリッル)リ mc (リ・リャルリァルル リケリッリッ リァルリアリウリァリヲル リァルリェル リオルルルリァ POPFile) ル ec (リ・リャルリァルル リケリッリッ リ」リョリキリァリ。 リァルリェリオルル館). ルリール リァルルほ館 リェリョリイル ルル ルルル ル異ル リォル ル韓ェル リ・リウリェリケルリァルルリァ ルルリエリア リ・リュリオリァリ。リァリェ リケル ルル館ル韓ゥ リァリウリェリケルリァル リァルルリァリウ ルル POPFile ル異リッル ルリャリァルリゥ. リァルリョリァリッル リァルリ」リウリァリウル ル館ほ異 リィリュルリク リァルリウリャルリァリェ ルルリッリゥ 5 リ」ル韓ァル ル異ル リォル ル韓ェル リュリールルリァリ ルル韓ウ ルルリァル リウリャルリァリェ リェリアリィリキ リィル館 リァルリ・リュリオリァリ。リァリェ ル畏ケルリァル異館 IP リァルルリアリッル韓ゥ). Security_ExplainUpdate (リケルリッルリァ ル館ル異 ルリケリァルリァル ル館ほ異 POPFile リィリ・リアリウリァル リァルルほ館 リァルリォルリァリォ リァルリェリァルル韓ゥ リ・ルル getpopfile.org ルリアリゥ ル畏ァリュリッリゥ ルル リァルル館異: ma (リアルほ リァルリ・リオリッリァリア リァルリ」リケルル ルルリウリョリゥ POPFile リァルルリアルリィリゥ)リ mi (リアルほ リァルリ・リオリッリァリア リァルリ」リッルル ルルリウリョリゥ POPFile リァルルリアルリィリゥ) ル bn (リアルほ リァルリィルル韓ゥ ルルリウリョリゥ POPFile リァルルリアルリィリゥ). POPFile ル韓ュリオル リケルル リャル畏ァリィ リケルル リエルル リオル畏アリゥ リェリクルリア ルル リ」リケルル リァルリオルリュリゥ リ・リーリァ ルリァ ルリァル ルルリァル リェリュリッル韓ォ. リァルリョリァリッル リァルリ」リウリァリウル ル館ほ異 リィリュルリク リァルリウリャルリァリェ ルルリッリゥ 5 リ」ル韓ァル ル異ル リォル ル韓ェル リュリールルリァリ ルル韓ウ ルルリァル リウリャルリァリェ リェリアリィリキ リィル館 リェルリュリオ リァルリェリュリッル韓ォリァリェ ル畏ケルリァル異館 IP リァルルリアリッル韓ゥ). Security_PasswordTitle ルルルリゥ リァルルリアル畏ア ルル畏ァリャルリゥ リァルルリウリェリョリッル Security_Password ルルルリゥ リァルルリアル畏ア Security_PasswordUpdate リェル リェリケリッル館 ルルルリゥ リァルルリアル畏ア Security_AUTHTitle リョリァリッル リケル リィリケリッ Security_SecureServer リョリァリッル POP3 SPA/AUTH Security_SecureServerUpdate ルルぺッ リェル リェリケリッル館 リァルリョリァリッル リァルリ「ルル リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Security_SecurePort リィル畏ァリィリゥ リ・リェリオリァル POP3 SPA/AUTH Security_SecurePortUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル POP3 SPA/AUTH リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Security_SMTPServer リョリァリッル SMTP リァルルリェリウルリウル Security_SMTPServerUpdate ルルぺッ リェル リェリケリッル館 リョリァリッル SMTP リァルルリェリウルリウル リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Security_SMTPPort リィル畏ァリィリゥ リ・リェリオリァル SMTP リァルルリェリウルリウルリゥ Security_SMTPPortUpdate ルルぺッ リェル リェリケリッル館 リィル畏ァリィリゥ リ・リェリオリァル SMTP リァルルリェリウルリウルリゥ リ・ルル %sリ ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルリケリァルリァ リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Security_POP3 リェルぺィル胎 リ・リェリオリァルリァリェ POP3 ルル リ」リャルリイリゥ リケル リィリケリッ (ル韓ェリキルリィ リ・リケリァリッリゥ リェリエリコル館 POPFile) Security_SMTP リェルぺィル胎 リ・リェリオリァルリァリェ SMTP ルル リ」リャルリイリゥ リケル リィリケリッ (ル韓ェリキルリィ リ・リケリァリッリゥ リェリエリコル館 POPFile) Security_NNTP リェルぺィル胎 リ・リェリオリァルリァリェ NNTP ルル リ」リャルリイリゥ リケル リィリケリッ (ル韓ェリキルリィ リ・リケリァリッリゥ リェリエリコル館 POPFile) Security_UI リェルぺィル胎 リ・リェリオリァルリァリェ HTTP (ル畏ァリャルリゥ リァルルリウリェリョリッル) ルル リ」リャルリイリゥ リケル リィリケリッ (ル韓ェリキルリィ リ・リケリァリッリゥ リェリエリコル館 POPFile) Security_XMLRPC リェルぺィル胎 リ・リェリオリァルリァリェ XML-RPC ルル リ」リャルリイリゥ リケル リィリケリッ (ル韓ェリキルリィ リ・リケリァリッリゥ リェリエリコル館 POPFile) Security_UpdateTitle リァルリェリュリッル韓ォ リァルリェルルぺァリヲル Security_Update リェルリュリオ リァルリェリュリッル韓ォリァリェ ル館異ル韓ァル Security_StatsTitle リァルリェルぺァリアル韓ア リァルリ・リュリオリァリヲル韓ゥ Security_Stats リァリアリウル リァルリ・リュリオリァリ。リァリェ ル館異ル韓ァル Magnet_Error1 リァルルリコルリァリキル韓ウ '%s' ルル畏ャル畏ッ ルリウリィルぺァル ルル リァルリッルル '%s' Magnet_Error2 リァルルリコルリァリキル韓ウ リァルリャリッル韓ッ '%s' ル韓ェリカリァリアリィ ルリケ リァルルリコルリァリキル韓ウ '%s' ルル リァルリッルル '%s' ル異館ルル リ」ル ル韓ェリウリィリィ ルル ルリェリァリヲリャ リコリアル韓ィリゥ. ルル ル韓ェル リ・リカリァルリゥ リァルルリコルリァリキル韓ウ. Magnet_Error3 リ・リオルリケ ルリコルリァリキル韓ウ リャリッル韓ッ '%s' ルル リァルリッルル '%s' Magnet_CurrentMagnets ルリコルリァリキル韓ウリァリェ リュリァルル韓ゥ Magnet_Message1 リァルルリコルリァリキル韓ウリァリェ リァルリェリァルル韓ゥ リェリャリケル リァルリィリアル韓ッ リ」ル ル韓ェリオルル ルル リァルリッルル リァルルリールル畏ア. Magnet_CreateNew リオルリケ ルリコルリァリキル韓ウ リャリッル韓ッ Magnet_Explanation リェル畏ャリッ ルリール リァルリ」ルル畏ァリケ ルル リァルルリコルリァリキリウル韓ァリェ:
  • リ・リウル リ」ル リケルル畏ァル リァルルリアリウル ルリォリァル: john@company.com ルルリキリァリィルぺゥ ル異ル リケルル畏ァル ルリュリッリッリ
    company.com ルルリキリァリィルぺゥ ルル リァルルリアリウルル館 ルル company.comリ
    John Doe ルルリキリァリィルぺゥ ル異ル リァリウル リエリョリオ ルリュリッリッリ
    John ルルリキリァリィルぺゥ ルル リァルリ」リエリョリァリオ リィリールル リァルリ」リウル
  • リ・リウル リ」ル リケルル畏ァル リァルルリウリェルぺィル: ルルリウ ルリォリァル リァルルリアリウル: ルルル ル韓ェル リァルリェリオルル館 リケルル リケルル リケルル畏ァル To/Cc ルル リァルリアリウリァルリゥ
  • ルルルリァリェ リァルルル畏カル畏ケ: ルリォリァル: hello ルルリキリァリィルぺゥ ルル リァルリアリウリァリヲル リァルリェル リィルリァ hello ルル リウリキリア リァルルル畏カル畏ケ
Magnet_MagnetType ルル畏ケ リァルルリコルリァリキル韓ウ Magnet_Value ルほ館リゥ Magnet_Always ル韓ールリィ ルル畏アリァル リ・ルル リァルリッルル Magnet_Jump リ・リールリィ リ・ルル リオルリュリゥ Bucket_Error1 リ」リウリァルル リァルリッルリァリ。 ル館ルル リ」ル リェリュリェル異 ルルぺキ リ」リュリアル ルル a リ・ルル z リィリ」リュリアル リオリコル韓アリゥリ リ」リアルぺァル ルル 0 リ・ルル 9リ - ル _ Bucket_Error2 リッルル リィリ・リウル %s ルル畏ャル畏ッ ルリウリィルぺァル Bucket_Error3 リェル リオルリケ リッルル リィリ・リウル %s Bucket_Error4 リァルリアリャリァリ。 リ・リッリョリァル ルルルリゥ リコル韓ア ルリァリアリコリゥ Bucket_Error5 リ」リケリッ リェリウルル韓ゥ リァルリッルル %s リ・ルル %s Bucket_Error6 リェル リュリール リァルリッルル %s Bucket_Title リ・リケリッリァリッリァリェ リァルリッルリァリ。 Bucket_BucketName リ・リウル
リァルリッルル Bucket_WordCount リケリッリッ リァルルルルリァリェ Bucket_WordCounts リ」リケリッリァリッ リァルルルルリァリェ Bucket_UniqueWords ルルルリァリェ
ルリョリェルルリゥ Bucket_SubjectModification リェリケリッル館
リァルルル畏カル畏ケ Bucket_ChangeColor ルル異
リァルリッルル Bucket_NotEnoughData リァルルリケルル異リァリェ リコル韓ア ルリァルル韓ゥ Bucket_ClassificationAccuracy リッルほ滞ゥ リァルリェリオルル館 Bucket_EmailsClassified リアリウリァリヲル ルリオルルリゥ Bucket_EmailsClassifiedUpper リアリウリァリヲル ルリオルルリゥ Bucket_ClassificationErrors リ」リョリキリァリ。 リェリオルル館 Bucket_Accuracy リッルほ滞ゥ Bucket_ClassificationCount リケリッリッ リァルリェリオルル館リァリェ Bucket_ClassificationFP リョリキリ」 リ・ル韓ャリァリィル Bucket_ClassificationFN リョリキリ」 リウルリィル Bucket_ResetStatistics リェリオルル韓ア リァルリ・リュリオリァリ。リァリェ Bucket_LastReset リ「リョリア リェリオルル韓ア Bucket_CurrentColor %s リュリァルル韓ァル ルル ルル異 %s Bucket_SetColorTo リコル館滞ア ルル異 %s リ・ルル %s Bucket_Maintenance リオル韓ァルリゥ Bucket_CreateBucket リ・リオルリケ リッルル リィリ・リウル Bucket_DeleteBucket リ・リュリール リァルリッルル リァルルリウルル Bucket_RenameBucket リ・リケリァリッリゥ リェリウルル韓ゥ リァルリッルル リァルルリウルル Bucket_Lookup リ・リィリュリォ Bucket_LookupMessage リャリッ ルルルリゥ ルル リッルリァリ。 Bucket_LookupMessage2 ルリェリァリヲリャ リァルリィリュリォ リケル Bucket_LookupMostLikely %s リケルル リァルリ」リアリャリュ リ」ル リェルル異 ルル %s Bucket_DoesNotAppear

%s リコル韓ア ルル畏ャル畏ッリゥ ルル リァル館 ルル リァルリッルリァリ。 Bucket_DisabledGlobally リケリキル リィリエルル リケリァル Bucket_To リ・ルル Bucket_Quarantine リケリイル
リァルリアリウリァルリゥ SingleBucket_Title リェルリァリオル館 %s SingleBucket_WordCount リケリッリッ ルルルリァリェ リァルリッルル SingleBucket_TotalWordCount リ・リャルリァルル リケリッリッ リァルルルルリァリェ SingleBucket_Percentage リァルルリウリィリゥ ルル リァルリ・リャルリァルル SingleBucket_WordTable リャリッル異 ルルルリァリェ %s SingleBucket_Message1 リ・リカリコリキ リケルル リュリアル ルル リァルルルリアリウ ルリケリアリカ リァルルルルリァリェ リァルリェル リェリィリッリ」 リィリールル リァルリュリアル. リ・リカリコリキ リケルル リ」ル韓ゥ ルルルリゥ ルリケリアリカ リ・リュリェルリァルル韓ェルリァ ルル ルリァルリゥ リァルリッルリァリ。. SingleBucket_Unique %s ルリョリェルルリゥ SingleBucket_ClearBucket リ・リュリール ルリァルリゥ リァルルルルリァリェ Session_Title リ・ルリェルリェ リオルリァリュル韓ゥ リャルリウリゥ POPFile Session_Error リ・ルリェルリェ リオルリァリュル韓ゥ リャルリウリゥ POPFile. ルリーリァ ル館ルル リ」ル ル韓ュリオル リ・リーリァ リァル リ・ルほリァル ル畏・リケリァリッリゥ リェリエリコル館 POPFile ル畏ェリアル リァルルリェリオルリュ ルルリェル畏ュ. リァルリアリャリァリ。 リァルリカリコリク リケルル リ・リュリッル リァルリアル畏ァリィリキ ルル リァルリ」リケルル ルルルリェリァリィリケリゥ ルル リ・リウリェリケルリァル POPFile. View_Title リケリアリカ リアリウリァルリゥ ルルリアリッリゥ View_ShowFrequencies リケリアリカ リェリアリッリッ リァルルルルリァリェ View_ShowProbabilities リケリアリカ リ・リュリェルリァルル韓ゥ リァルルルルリァリェ View_ShowScores リケリアリカ ルリェリァリヲリャ リァルルルルリァリェ View_WordMatrix ルリオルル異リゥ リァルルルルリァリェ View_WordProbabilities リケリアリカ リ・リュリェルリァルル韓ゥ リァルルルルリァリェ View_WordFrequencies リケリアリカ リェリアリッリッ リァルルルルリァリェ View_WordScores リケリアリカ ルリェリァリヲリャ リァルルルルリァリェ View_Chart リアリウル壷 リァルルぺアリァリア Windows_TrayIcon リケリアリカ リァル館ほ異リゥ POPFile ルル リエリアル韓キ リァルルルリァルリ Windows_Console リェリエリコル館 POPFile ルル ルリァルリーリゥ ルリオル韓ゥリ Windows_NextTime

ルリーリァ リァルリェリケリッル館 ルル ル館ル異 ルルぺァルリァル リ・ルル リ」ル ル韓ェル リ・リケリァリッリゥ リェリエリコル館 POPFile Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. History_OpenMessageSummary This table contains the full text of a message message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the message's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many messages have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. Bucket_AccuracyChartSummary This table graphically represents the accuracy of the message classification. Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of messages classified, and total word counts. Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify message according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the message before it is passed on to the message client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying message due to their relative frequency in message in general. They are organized per row according to the first letter of the words. Imap_Bucket2Folder リァルリィリアル韓ッ ルルリッルル %s ル韓ールリィ ルルルリャルリッ Imap_MapError ルリァ ル館ルル リェリュル異館 リァルリォリア ルル リッルル ル畏ァリュリッ ルルル ルリャルリッ! Imap_Server リョリァリッル IMAP: Imap_ServerNameError リァルリアリャリァリ。 リ・リッリョリァル リァリウル リァルリュリァリッル! Imap_Port リィル畏ァリィリゥ リ・リェリオリァル IMAP: Imap_PortError リァルリアリャリァリ。 リ・リッリョリァル リアルほ リィル畏ァリィリゥ リオリュル韓ュ! Imap_Login リ・リウル ルリウリェリョリッル IMAP: Imap_LoginError リァルリアリャリァリ。 リ・リッリョリァル リ・リウル リァルルリウリェリョリッル! Imap_Password ルルルリゥ リァルルリアル畏ア ルリュリウリァリィ IMAP: Imap_PasswordError リァルリアリャリァリ。 リ・リッリョリァル ルルルリゥ リァルルリアル畏ア! Imap_Expunge ルリウリュ リァルリアリウリァリヲル リァルルリュリール異ル ルル リァルルリャルリッリァリェ リァルルリアリァルぺィリゥ. Imap_Interval ルリェリアリゥ リァルリェリュリッル韓ォ リィリァルリォル畏ァルル: Imap_IntervalError リァルリアリャリァリ。 リ・リッリョリァル ルリェリアリゥ リィル館 10 ル 3600 リォリァルル韓ゥ. Imap_Bytelimit リィリァル韓ェ ルルル リアリウリァルリゥ ルル リ」リャル リァルリェリオルル館. リ」リッリョル 0 (Null) ルリ・リウリェリケルリァル リァルリアリウリァルリゥ ルリァルルリゥ: Imap_BytelimitError リァルリアリャリァリ。 リ・リッリョリァル リアルほ. Imap_RefreshFolders リェリュリッル韓ォ ルぺァリヲルリゥ リァルルリャルリッリァリェ Imap_Now リァルリ「ル! Imap_UpdateError1 ルル リェリェル リケルルル韓ゥ リァルリッリョル異. リァルリアリャリァリ。 リァルリェリ」ルリッ ルル リ・リウル リァルルリウリェリョリッル ル異ルルリゥ リァルルリアル畏ア. Imap_UpdateError2 ルリエルリェ リケルルル韓ゥ リァルリ・リェリオリァル リィリァルリョリァリッル. リァルリアリャリァリ。 リァルリェリ」ルリッ ルル リ・リウル リァルリョリァリッル ル畏アルほ リィル畏ァリィリゥ リァルリ・リェリオリァル ル畏ァルリェリ」ルリッ ルル リ」ル リァルリ・リェリオリァル ルリケ リァルリエリィルリゥ ルル畏ャル畏ッ. Imap_UpdateError3 リァルリアリャリァリ。 リ・リケリッリァリッ リェルリァリオル館 リァルリ・リェリオリァル リ」ル異リァル. Imap_NoConnectionMessage リァルリアリャリァリ。 リ・リケリッリァリッ リェルリァリオル館 リァルリ・リェリオリァル リ」ル異リァル. リィリケリッ リァルリ・ルリェルリァリ。 ルルルリ リウル異 リェリクルリア ルル ルリール リァルリオルリュリゥ リァルルリイル韓ッ ルル リァルリョル韓ァリアリァリェ. Imap_WatchMore ルリャルリッ ルリケリアリカ リァルルリャルリッリァリェ リァルルリアリァルぺィリゥ Imap_WatchedFolder ルリャルリッ ルリアリァルぺィ リアルほ Shutdown_Message リェル リ・ルほリァル POPFile Help_Training リケルリッ リ・リウリェリケルリァルル POPFile ルリ」ル異 ルリアリゥリ ルリ・ルル ルリァ ル韓ケリアル リ」ル リエル韓。 ル異韓ュリェリァリャ ルリィリケリカ リァルリェリッリアル韓ィ. ル韓ュリェリァリャ POPFile ルルリェリッリアル韓ィ リケルル リアリウリァリヲル ルルル リッルル畏 リァルリェリッリアル韓ィ ル韓ェル リケルリッ リ・リケリァリッリゥ リェリオルル館 リアリウリァルリゥ ルぺァル POPFile リィリェリオルル館ルリァ リィリエルル リョリァリキリヲ. リウリェリュリェリァリャ リ」ル韓カリァル リ・ルル リ・リケリッリァリッ リィリアルリァルリャ リァルリィリアル韓ッ ルル館ほ異 リィリェリアリェル韓ィ リァルリィリアル韓ッ リュリウリィ リェリオルル館リァリェ POPFile. ル館ルル リァルリケリォル畏ア リケルル リァルリェリケルル館リァリェ ルリ・リケリッリァリッ リィリアリァルリャ リァルリィリアル韓ッ ルル リオルリュリァリェ リェリケルル館リァリェ POPFile. Help_Bucket_Setup ル韓ュリェリァリャ POPFile リ・ルル リッルル異館 リケルル リァルリ」ルほ リィリァルリ・リカリァルリゥ リ・ルル リッルル リコル韓ア-リァルルリオルル. ルリァ ル韓ャリケル POPFile ルリアル韓ッリァル ルル リ」ルル ル韓ウリェリキル韓ケ リェリオルル館 リィリアル韓ッ リァルリォリア ルル ルリーリァリ リェリウリェリキル韓ケ リァル ル館ル異 リケルリッル リ」ル リケリッリッ ルル リァルリッルリァリ。. リ」リィリウリキ リ・リケリッリァリッ ルル リ」ル ル館ル異 リケルリッル リァルリッルリァリ。 "spam"リ "personal"リ "work". Help_No_More ルリァ リェリケリアリカ ルリーリァ ルリアリゥ リ」リョリアル popfile-1.1.3+dfsg/favicon.ico0000664000175000017500000001635611624177332015507 0ustar danieldanielh6 ィ00ィF( @タタタタワタハヲ、ヤア車kニHク%ェェ爪zケbJs2Pヤアヌ辞kHs%WUIワ=ケ1%sPヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UIワ=ケ1%sPヤ箜ヤニkクHェ%ェワzケbJs2PヤアkH%ワワケケssPPヤア車kニHク%ェェワケzbsJP2ヤアヌ辞kHs%WUワIケ=1s%Pヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UワIケ=1s%Pヤ箜ヤニkクHェ%ェワケz肪sJP2ヤアkH%ワワケケ末ssPPヤアヤニkクHェ%ェ爪zケbJs2PヤヌアォksHW%UIワ=ケ1%sPヤヤアアkkHH%%ワケsPヤアヌォkHs%WUワIケ=1s%PヤアヤkニHク%ェェワケz肪sJP2ヤアkH%ワワケケ末ssPP跏レレレホホホツツツカカカェェェ棍鋳zzznnnbbbVVVJJJ>>>222&&&ソシ/[Mホur3?( @タタタタワタハヲ、ヤア車kニHク%ェェ爪zケbJs2Pヤアヌ辞kHs%WUIワ=ケ1%sPヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UIワ=ケ1%sPヤ箜ヤニkクHェ%ェワzケbJs2PヤアkH%ワワケケssPPヤア車kニHク%ェェワケzbsJP2ヤアヌ辞kHs%WUワIケ=1s%Pヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UワIケ=1s%Pヤ箜ヤニkクHェ%ェワケz肪sJP2ヤアkH%ワワケケ末ssPPヤアヤニkクHェ%ェ爪zケbJs2PヤヌアォksHW%UIワ=ケ1%sPヤヤアアkkHH%%ワケsPヤアヌォkHs%WUワIケ=1s%PヤアヤkニHク%ェェワケz肪sJP2ヤアkH%ワワケケ末ssPP跏レレレホホホツツツカカカェェェ棍鋳zzznnnbbbVVVJJJ>>>222&&&マ鈞 ァワ3錮1錮|sチ>3ヘ<タトp轣(0` タタタタワタハヲ、ヤア車kニHク%ェェ爪zケbJs2Pヤアヌ辞kHs%WUIワ=ケ1%sPヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UIワ=ケ1%sPヤ箜ヤニkクHェ%ェワzケbJs2PヤアkH%ワワケケssPPヤア車kニHク%ェェワケzbsJP2ヤアヌ辞kHs%WUワIケ=1s%Pヤヤアア試kkHH%%ワケsP耿ヌアォ縮sHW%UワIケ=1s%Pヤ箜ヤニkクHェ%ェワケz肪sJP2ヤアkH%ワワケケ末ssPPヤアヤニkクHェ%ェ爪zケbJs2PヤヌアォksHW%UIワ=ケ1%sPヤヤアアkkHH%%ワケsPヤアヌォkHs%WUワIケ=1s%PヤアヤkニHク%ェェワケz肪sJP2ヤアkH%ワワケケ末ssPP跏レレレホホホツツツカカカェェェ棍鋳zzznnnbbbVVVJJJ>>>222&&&タ3ヌマ?ヌマ?マ???テヌチ8游テ1醸bタチ  ?゚マ猊マタ?タ??タ?タタタタタタ??popfile-1.1.3+dfsg/Classifier/0000775000175000017500000000000011710356074015435 5ustar danieldanielpopfile-1.1.3+dfsg/Classifier/Bayes.pm0000664000175000017500000045730511710356074017054 0ustar danieldaniel# POPFILE LOADABLE MODULE package Classifier::Bayes; use POPFile::Module; @ISA = ("POPFile::Module"); #---------------------------------------------------------------------------- # # Bayes.pm --- Naive Bayes text classifier # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Modified by Sam Schinke (sschinke@users.sourceforge.net) # Merged with db code from Scott Leighton (helphand@users.sourceforge.net) # #---------------------------------------------------------------------------- use strict; use warnings; use locale; use Classifier::MailParse; use IO::Handle; use DBI; use Digest::MD5 qw( md5_hex ); use MIME::Base64; use File::Copy; # This is used to get the hostname of the current machine # in a cross platform way use Sys::Hostname; # A handy variable containing the value of an EOL for networks my $eol = "\015\012"; # Korean characters definition my $ksc5601_sym = '(?:[\xA1-\xAC][\xA1-\xFE])'; my $ksc5601_han = '(?:[\xB0-\xC8][\xA1-\xFE])'; my $ksc5601_hanja = '(?:[\xCA-\xFD][\xA1-\xFE])'; my $ksc5601 = "(?:$ksc5601_sym|$ksc5601_han|$ksc5601_hanja)"; my $eksc = "(?:$ksc5601|[\x81-\xC6][\x41-\xFE])"; #extended ksc #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); # Set this to 1 to get scores for individual words in message detail $self->{wordscores__} = 0; # Choice for the format of the "word matrix" display. $self->{wmformat__} = ''; # Just our hostname $self->{hostname__} = ''; # File Handle for DBI database $self->{db__} = {}; $self->{history__} = 0; # To save time we also 'prepare' some commonly used SQL statements # and cache them here, see the function db_connect__ for details $self->{db_get_buckets__} = 0; $self->{db_get_wordid__} = 0; $self->{db_get_word_count__} = 0; $self->{db_put_word_count__} = 0; $self->{db_get_unique_word_count__} = 0; $self->{db_get_bucket_word_counts__} = 0; $self->{db_get_bucket_word_count__} = 0; $self->{db_get_full_total__} = 0; $self->{db_get_bucket_parameter__} = 0; $self->{db_set_bucket_parameter__} = 0; $self->{db_get_bucket_parameter_default__} = 0; $self->{db_get_buckets_with_magnets__} = 0; $self->{db_delete_zero_words__} = 0; # Caches the name of each bucket and relates it to both the bucket # ID in the database and whether it is pseudo or not # # Subkeys used are: # # id The bucket ID in the database # pseudo 1 if this is a pseudo bucket $self->{db_bucketid__} = {}; # Caches the IDs that map to parameter types $self->{db_parameterid__} = {}; # Caches looked up parameter values on a per bucket basis $self->{db_parameters__} = {}; # Used to parse mail messages $self->{parser__} = new Classifier::MailParse; # The possible colors for buckets $self->{possible_colors__} = [ 'red', 'green', 'blue', 'brown', # PROFILE BLOCK START 'orange', 'purple', 'magenta', 'gray', 'plum', 'silver', 'pink', 'lightgreen', 'lightblue', 'lightcyan', 'lightcoral', 'lightsalmon', 'lightgrey', 'darkorange', 'darkcyan', 'feldspar', 'black' ]; # PROFILE BLOCK STOP # Precomputed per bucket probabilities $self->{bucket_start__} = {}; # A very unlikely word $self->{not_likely__} = {}; # The expected corpus version # # DEPRECATED This is only used when upgrading old flat file corpus files # to the database $self->{corpus_version__} = 1; # The unclassified cutoff this value means that the top # probabilily must be n times greater than the second probability, # default is 100 times more likely $self->{unclassified__} = log(100); # Used to tell the caller whether a magnet was used in the last # mail classification $self->{magnet_used__} = 0; $self->{magnet_detail__} = 0; # This maps session keys (long strings) to user ids. If there's # an entry here then the session key is valid and can be used in # the POPFile API. See the methods get_session_key and # release_session_key for details $self->{api_sessions__} = {}; # Used to indicate whether we are using SQLite and what the full # path and name of the database is if we are. $self->{db_is_sqlite__} = 0; $self->{db_name__} = ''; # Must call bless before attempting to call any methods bless $self, $type; $self->name( 'bayes' ); return $self; } #---------------------------------------------------------------------------- # # forked # # This is called inside a child process that has just forked, since # the child needs access to the database we open it # #---------------------------------------------------------------------------- sub forked { my ( $self ) = @_; $self->db_connect__(); } #---------------------------------------------------------------------------- # # childexit # # This is called inside a child process that is about to finish, since # the child does not need access to the database we close it # #---------------------------------------------------------------------------- sub childexit { my ( $self ) = @_; $self->db_disconnect__(); } #---------------------------------------------------------------------------- # # initialize # # Called to set up the Bayes module's parameters # #---------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # This is the name for the database $self->config_( 'database', 'popfile.db' ); # This is the 'connect' string used by DBI to connect to the # database, if you decide to change from using SQLite to some # other database (e.g. MySQL, Oracle, ... ) this *should* be all # you need to change. The additional parameters user and auth are # needed for some databases. # # Note that the dbconnect string # will be interpolated before being passed to DBI and the variable # $dbname can be used within it and it resolves to the full path # to the database named in the database parameter above. $self->config_( 'dbconnect', 'dbi:SQLite:dbname=$dbname' ); $self->config_( 'dbuser', '' ); $self->config_( 'dbauth', '' ); # SQLite 1.05+ had some problems we've resolved. # This parameter is no longer used but we leave it for future use $self->config_( 'bad_sqlite_version', '4.0.0' ); # No default unclassified weight is the number of times more sure # POPFile must be of the top class vs the second class, default is # 100 times more $self->config_( 'unclassified_weight', 100 ); # The corpus is kept in the 'corpus' subfolder of POPFile # # DEPRECATED This is only used to find an old corpus that might # need to be upgraded $self->config_( 'corpus', 'corpus' ); # The characters that appear before and after a subject # modification $self->config_( 'subject_mod_left', '[' ); $self->config_( 'subject_mod_right', ']' ); # The position to insert a subject modification # 1 : Beginning of the subject (default) # -1 : End of the subject $self->config_( 'subject_mod_pos', 1 ); # Get the hostname for use in the X-POPFile-Link header $self->{hostname__} = hostname; # Allow the user to override the hostname $self->config_( 'hostname', $self->{hostname__} ); # If set to 1 then the X-POPFile-Link will have < > around the URL # (i.e. X-POPFile-Link: ) when set to 0 there are # none (i.e. X-POPFile-Link: http://foo.bar) $self->config_( 'xpl_angle', 0 ); # This parameter is used when the UI is operating in Stealth Mode. # If left blank (the default setting) the X-POPFile-Link will use 127.0.0.1 # otherwise it will use this string instead. The system's HOSTS file should # map the string to 127.0.0.1 $self->config_( 'localhostname', '' ); # This is a bit mask used to control options when we are using the # default SQLite database. By default all the options are on. # # 1 = Asynchronous deletes # 2 = Backup database every hour $self->config_( 'sqlite_tweaks', 0xFFFFFFFF ); # SQLite Journal mode. # To use this option, DBD::SQLite v1.20 or later is required. # # delete : Delete journal file after committing. (default) # Slow but reliable. # truncate : Truncate journal file to zero length after committing. # Faster than 'delete' in some environment but less reliable. # persist : Persist journal file after committing. # Faster than 'delete' in some environment but less reliable. # memory : Store journal file in memory. # Very fast but can't rollback when process crashes. # off : Turn off journaling. # Fastest of all but can't rollback. # # For more information about the journal mode, see: # http://www.sqlite.org/pragma.html#pragma_journal_mode $self->config_( 'sqlite_journal_mode', 'delete' ); # Japanese wakachigaki parser ('kakasi' or 'mecab' or 'internal'). $self->config_( 'nihongo_parser', 'kakasi' ); $self->mq_register_( 'COMIT', $self ); $self->mq_register_( 'RELSE', $self ); # Register for the TICKD message which is sent hourly by the # Logger module. We use this to hourly save the database if bit 1 # of the sqlite_tweaks is set and we are using SQLite $self->mq_register_( 'TICKD', $self ); return 1; } #---------------------------------------------------------------------------- # # deliver # # Called by the message queue to deliver a message # # There is no return value from this method # #---------------------------------------------------------------------------- sub deliver { my ( $self, $type, @message ) = @_; if ( $type eq 'COMIT' ) { $self->classified( $message[0], $message[2] ); } if ( $type eq 'RELSE' ) { $self->release_session_key_private__( $message[0] ); } if ( $type eq 'TICKD' ) { $self->backup_database__(); } } #---------------------------------------------------------------------------- # # start # # Called to start the Bayes module running # #---------------------------------------------------------------------------- sub start { my ( $self ) = @_; # In Japanese or Korean or Chinese mode, explicitly set LC_COLLATE and # LC_CTYPE to C. # # This is to avoid Perl crash on Windows because default # LC_COLLATE of Japanese Win is Japanese_Japan.932(Shift_JIS), # which is different from the charset POPFile uses for Japanese # characters(EUC-JP). # # And on some configuration (e.g. Japanese Mac OS X), LC_CTYPE is set to # UTF-8 but POPFile uses EUC-JP encoding for Japanese. In this situation # lc() does not work correctly. my $language = $self->module_config_( 'html', 'language' ) || ''; if ( $language =~ /^(Nihongo$|Korean$|Chinese)/ ) { use POSIX qw( locale_h ); setlocale( LC_COLLATE, 'C' ); setlocale( LC_CTYPE, 'C' ); } # Pass in the current interface language for language specific parsing $self->{parser__}->{lang__} = $language; $self->{unclassified__} = log( $self->config_( 'unclassified_weight' ) ); if ( !$self->db_connect__() ) { return 0; } if ( $language eq 'Nihongo' ) { # Setup Nihongo (Japanese) parser. my $nihongo_parser = $self->config_( 'nihongo_parser' ); $nihongo_parser = $self->{parser__}->setup_nihongo_parser( $nihongo_parser ); $self->log_( 2, "Use Nihongo (Japanese) parser : $nihongo_parser" ); $self->config_( 'nihongo_parser', $nihongo_parser ); # Since Text::Kakasi is not thread-safe, we use it under the # control of a Mutex to avoid a crash if we are running on # Windows and using the fork. if ( ( $nihongo_parser eq 'kakasi' ) && ( $^O eq 'MSWin32' ) && # PROFILE BLOCK START ( ( ( $self->module_config_( 'pop3', 'enabled' ) ) && ( $self->module_config_( 'pop3', 'force_fork' ) ) ) || ( ( $self->module_config_( 'nntp', 'enabled' ) ) && ( $self->module_config_( 'nntp', 'force_fork' ) ) ) || ( ( $self->module_config_( 'smtp', 'enabled' ) ) && ( $self->module_config_( 'smtp', 'force_fork' ) ) ) ) ) { # PROFILE BLOCK STOP $self->{parser__}->{need_kakasi_mutex__} = 1; # PROFILE PLATFORM START MSWin32 # Prepare the Mutex. require POPFile::Mutex; $self->{parser__}->{kakasi_mutex__} = new POPFile::Mutex( 'mailparse_kakasi' ); $self->log_( 2, "Create mutex for Kakasi." ); # PROFILE PLATFORM STOP MSWin32 } } $self->upgrade_predatabase_data__(); return 1; } #---------------------------------------------------------------------------- # # stop # # Called when POPFile is terminating # #---------------------------------------------------------------------------- sub stop { my ( $self ) = @_; $self->db_disconnect__(); delete $self->{parser__}; } #---------------------------------------------------------------------------- # # classified # # Called to inform the module about a classification event # # There is no return value from this method # #---------------------------------------------------------------------------- sub classified { my ( $self, $session, $class ) = @_; $self->set_bucket_parameter( $session, $class, 'count', # PROFILE BLOCK START $self->get_bucket_parameter( $session, $class, 'count' ) + 1 ); # PROFILE BLOCK STOP } #---------------------------------------------------------------------------- # # backup_database__ # # Called when the TICKD message is received each hour and if we are using # the default SQLite database will make a copy with the .backup extension # #---------------------------------------------------------------------------- sub backup_database__ { my ( $self ) = @_; # If database backup is turned on and we are using SQLite then # backup the database by copying it if ( ( $self->config_( 'sqlite_tweaks' ) & 2 ) && # PROFILE BLOCK START $self->{db_is_sqlite__} ) { # PROFILE BLOCK STOP if ( !copy( $self->{db_name__}, $self->{db_name__} . ".backup" ) ) { $self->log_( 0, "Failed to backup database ".$self->{db_name__} ); } } } #---------------------------------------------------------------------------- # # tweak_sqlite # # Called when a module wants is to tweak access to the SQLite database. # # $tweak The tweak to apply (a bit in the sqlite_tweaks mask) # $state 1 to enable the tweak, 0 to disable # $db The db handle to tweak # #---------------------------------------------------------------------------- sub tweak_sqlite { my ( $self, $tweak, $state, $db ) = @_; if ( $self->{db_is_sqlite__} && ( $self->config_( 'sqlite_tweaks' ) & $tweak ) ) { $self->log_( 1, "Performing tweak $tweak to $state" ); if ( $tweak == 1 ) { my $sync = $state?'off':'normal'; $db->do( "pragma synchronous=$sync;" ); } } } #---------------------------------------------------------------------------- # # reclassified # # Called to inform the module about a reclassification from one bucket # to another # # session Valid API session # bucket The old bucket name # newbucket The new bucket name # undo 1 if this is an undo operation # # There is no return value from this method # #---------------------------------------------------------------------------- sub reclassified { my ( $self, $session, $bucket, $newbucket, $undo ) = @_; $self->log_( 0, "Reclassification from $bucket to $newbucket" ); my $c = $undo?-1:1; if ( $bucket ne $newbucket ) { my $count = $self->get_bucket_parameter( # PROFILE BLOCK START $session, $newbucket, 'count' ); # PROFILE BLOCK STOP my $newcount = $count + $c; $newcount = 0 if ( $newcount < 0 ); $self->set_bucket_parameter( # PROFILE BLOCK START $session, $newbucket, 'count', $newcount ); # PROFILE BLOCK STOP $count = $self->get_bucket_parameter( # PROFILE BLOCK START $session, $bucket, 'count' ); # PROFILE BLOCK STOP $newcount = $count - $c; $newcount = 0 if ( $newcount < 0 ); $self->set_bucket_parameter( # PROFILE BLOCK START $session, $bucket, 'count', $newcount ); # PROFILE BLOCK STOP my $fncount = $self->get_bucket_parameter( # PROFILE BLOCK START $session, $newbucket, 'fncount' ); # PROFILE BLOCK STOP my $newfncount = $fncount + $c; $newfncount = 0 if ( $newfncount < 0 ); $self->set_bucket_parameter( # PROFILE BLOCK START $session, $newbucket, 'fncount', $newfncount ); # PROFILE BLOCK STOP my $fpcount = $self->get_bucket_parameter( # PROFILE BLOCK START $session, $bucket, 'fpcount' ); # PROFILE BLOCK STOP my $newfpcount = $fpcount + $c; $newfpcount = 0 if ( $newfpcount < 0 ); $self->set_bucket_parameter( # PROFILE BLOCK START $session, $bucket, 'fpcount', $newfpcount ); # PROFILE BLOCK STOP } } #---------------------------------------------------------------------------- # # get_color # # Retrieves the color for a specific word, color is the most likely bucket # # $session Session key returned by get_session_key # $word Word to get the color of # #---------------------------------------------------------------------------- sub get_color { my ( $self, $session, $word ) = @_; my $max = -10000; my $color = 'black'; for my $bucket ($self->get_buckets( $session )) { my $prob = $self->get_value_( $session, $bucket, $word ); if ( $prob != 0 ) { if ( $prob > $max ) { $max = $prob; $color = $self->get_bucket_parameter( $session, $bucket, # PROFILE BLOCK START 'color' ); # PROFILE BLOCK STOP } } } return $color; } #---------------------------------------------------------------------------- # # get_not_likely_ # # Returns the probability of a word that doesn't appear # #---------------------------------------------------------------------------- sub get_not_likely_ { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return $self->{not_likely__}{$userid}; } #---------------------------------------------------------------------------- # # get_value_ # # Returns the value for a specific word in a bucket. The word is # converted to the log value of the probability before return to get # the raw value just hit the hash directly or call get_base_value_ # #---------------------------------------------------------------------------- sub get_value_ { my ( $self, $session, $bucket, $word ) = @_; my $value = $self->db_get_word_count__( $session, $bucket, $word ); if ( defined( $value ) && ( $value > 0 ) ) { # Profiling notes: # # I tried caching the log of the total value and then doing # log( $value ) - $cached and this turned out to be # much slower than this single log with a division in it return log( $value / # PROFILE BLOCK START $self->get_bucket_word_count( $session, $bucket ) ); # PROFILE BLOCK STOP } else { return 0; } } sub get_base_value_ { my ( $self, $session, $bucket, $word ) = @_; my $value = $self->db_get_word_count__( $session, $bucket, $word ); if ( defined( $value ) ) { return $value; } else { return 0; } } #---------------------------------------------------------------------------- # # set_value_ # # Sets the value for a word in a bucket and updates the total word # counts for the bucket and globally # #---------------------------------------------------------------------------- sub set_value_ { my ( $self, $session, $bucket, $word, $value ) = @_; if ( $self->db_put_word_count__( $session, $bucket, # PROFILE BLOCK START $word, $value ) == 1 ) { # PROFILE BLOCK STOP # If we set the word count to zero then clean it up by deleting the # entry my $userid = $self->valid_session_key__( $session ); my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_delete_zero_words__}, $bucketid ); # PROFILE BLOCK STOP return 1; } else { return 0; } } #---------------------------------------------------------------------------- # # get_sort_value_ behaves the same as get_value_, except that it # returns not_likely__ rather than 0 if the word is not found. This # makes its result more suitable as a sort key for bucket ranking. # #---------------------------------------------------------------------------- sub get_sort_value_ { my ( $self, $session, $bucket, $word ) = @_; my $v = $self->get_value_( $session, $bucket, $word ); if ( $v == 0 ) { my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return $self->{not_likely__}{$userid}; } else { return $v; } } #---------------------------------------------------------------------------- # # update_constants__ # # Updates not_likely and bucket_start # #---------------------------------------------------------------------------- sub update_constants__ { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $wc = $self->get_word_count( $session ); if ( $wc > 0 ) { $self->{not_likely__}{$userid} = -log( 10 * $wc ); foreach my $bucket ( $self->get_buckets( $session ) ) { my $total = $self->get_bucket_word_count( $session, $bucket ); if ( $total != 0 ) { $self->{bucket_start__}{$userid}{$bucket} = # PROFILE BLOCK START log( $total / $wc ); # PROFILE BLOCK STOP } else { $self->{bucket_start__}{$userid}{$bucket} = 0; } } } else { $self->{not_likely__}{$userid} = 0; } } #---------------------------------------------------------------------------- # # db_connect__ # # Connects to the POPFile database and returns 1 if successful # #---------------------------------------------------------------------------- sub db_connect__ { my ( $self ) = @_; # Connect to the database, note that the database must exist for # this to work, to make this easy for people POPFile we will # create the database automatically here using the file # 'popfile.sql' which should be located in the same directory the # Classifier/Bayes.pm module # If we are using SQLite then the dbname is actually the name of a # file, and hence we treat it like one, otherwise we leave it # alone my $dbname; my $dbconnect = $self->config_( 'dbconnect' ); my $dbpresent; my $sqlite = ( $dbconnect =~ /sqlite/i ); my $mysql = ( $dbconnect =~ /mysql/i ); my %connection_options = (); if ( $sqlite ) { $dbname = $self->get_user_path_( $self->config_( 'database' ) ); $dbpresent = ( -e $dbname ) || 0; } else { $dbname = $self->config_( 'database' ); $dbpresent = 1; if ( $mysql ) { # Turn on auto_reconnect $connection_options{mysql_auto_reconnect} = 1; } } # Record whether we are using SQLite or not and the name of the # database so that other routines can access it; this is used by # the backup_database__ routine to make a backup copy of the # database when using SQLite. $self->{db_is_sqlite__} = $sqlite; $self->{db_name__} = $dbname; # Now perform the connect, note that this is database independent # at this point, the actual database that we connect to is defined # by the dbconnect parameter. $dbconnect =~ s/\$dbname/$dbname/g; $self->log_( 0, "Attempting to connect to $dbconnect ($dbpresent)" ); my $need_convert = 0; my $old_dbh; if ( $sqlite && $dbpresent ) { # Check if the database is SQLite2 format open DBFILE, $dbname; my $buffer; my $readed = sysread( DBFILE, $buffer, 47 ); close DBFILE; if ( $buffer eq '** This file contains an SQLite 2.1 database **' ) { $self->log_( 0, 'SQLite 2 database found. Try to upgrade' ); # Test DBD::SQLite version my $ver = -1; eval { require DBD::SQLite; $ver = $DBD::SQLite::VERSION; }; if ( $ver ge '1.00' ) { $self->log_( 0, "DBD::SQLite $ver found" ); # Backup SQLite2 database my $old_dbname = $dbname . '-sqlite2'; unlink $old_dbname; rename $dbname, $old_dbname; # Connect to SQLite2 database my $old_dbconnect = $self->config_( 'dbconnect' ); $old_dbconnect =~ s/SQLite:/SQLite2:/; $old_dbconnect =~ s/\$dbname/$old_dbname/g; $old_dbh = DBI->connect( $old_dbconnect, # PROFILE BLOCK START $self->config_( 'dbuser' ), $self->config_( 'dbauth' ) ); # PROFILE BLOCK STOP # Update the config file $dbconnect = $self->config_( 'dbconnect' ); $dbconnect =~ s/SQLite2:/SQLite:/; $self->config_( 'dbconnect', $dbconnect ); $dbconnect =~ s/\$dbname/$dbname/g; $need_convert = 1; } } else { # Update the config file $dbconnect = $self->config_( 'dbconnect' ); $dbconnect =~ s/SQLite2:/SQLite:/; $self->config_( 'dbconnect', $dbconnect ); $dbconnect =~ s/\$dbname/$dbname/g; } } if ( $sqlite && ( $^O eq 'MSWin32' ) && # PROFILE BLOCK START ( $self->{parser__}->{lang__} eq 'Nihongo' ) && ( $dbconnect =~ /SQLite:/ ) ) { # PROFILE BLOCK STOP require DBD::SQLite; if ( ( $DBD::SQLite::VERSION ge '1.10' ) || # PROFILE BLOCK START ( $DBD::SQLite::sqlite_version ge '3.2.6' ) ) { # PROFILE BLOCK STOP # SQLite 3.2.6 or later uses the unicode API in Windows. # http://www.sqlite.org/changes.html#version_3_2_6 # We need to convert database path to UTF-8 if we are using # SQLite 3.2.6 or later. require File::Glob::Windows; require Encode; my $code_page = File::Glob::Windows::getCodePage(); $self->log_( 1, "Converting database connection string from $code_page to utf-8." ); Encode::from_to( $dbconnect, $code_page, 'utf-8' ); } } $self->{db__} = DBI->connect( $dbconnect, # PROFILE BLOCK START $self->config_( 'dbuser' ), $self->config_( 'dbauth' ), \%connection_options ); # PROFILE BLOCK STOP if ( !defined( $self->{db__} ) ) { $self->log_( 0, "Failed to connect to database and got error $DBI::errstr" ); return 0; } if ( $sqlite ) { $self->log_( 0, "Using SQLite library version " . $self->{db__}{sqlite_version} ); if ( $need_convert ) { $self->log_( 0, 'Convert SQLite2 database to SQLite3 database' ); $self->db_upgrade__( $old_dbh ); $old_dbh->disconnect; $self->log_( 0, 'Database convert completed' ); } # Set the synchronous mode to normal ( default of SQLite 2.x ). $self->tweak_sqlite( 1, 1, $self->{db__} ); # For Japanese compatibility if ( $self->{parser__}->{lang__} eq 'Nihongo' ) { $self->{db__}->do( 'pragma case_sensitive_like=1;' ); } if ( $self->{db__}{sqlite_version} ge '3.6.0' ) { # Configure journal mode my $journal_mode = $self->config_( 'sqlite_journal_mode' ); if ( $journal_mode =~ /^(delete|truncate|persist|memory|off)$/i ) { $self->{db__}->do( "pragma journal_mode=$journal_mode;" ); } } } if ( !$dbpresent ) { if ( !$self->insert_schema__( $sqlite ) ) { return 0; } } # Now check for a need to upgrade the database because the schema # has been changed. From POPFile v0.22.0 there's a special # 'popfile' table inside the database that contains the schema # version number. If the version number doesn't match or is # missing then do the upgrade. open SCHEMA, '<' . $self->get_root_path_( 'Classifier/popfile.sql' ); =~ /-- POPFILE SCHEMA (\d+)/; my $version = $1; close SCHEMA; my $need_upgrade = 1; # # retrieve the SQL_IDENTIFIER_QUOTE_CHAR for the database then use it # to strip off any sqlquotechars from the table names we retrieve # my $sqlquotechar = $self->{db__}->get_info(29) || ''; my @tables = map { s/$sqlquotechar//g; $_ } ($self->{db__}->tables()); foreach my $table (@tables) { if ( $table =~ /\.?popfile$/ ) { my @row = $self->{db__}->selectrow_array( # PROFILE BLOCK START 'select version from popfile;' ); # PROFILE BLOCK STOP if ( $#row == 0 ) { $need_upgrade = ( $row[0] != $version ); } } } if ( $need_upgrade ) { print "\n\nDatabase schema is outdated, performing automatic upgrade\n"; # The database needs upgrading $self->db_upgrade__(); print "\nDatabase upgrade complete\n\n"; } # Now prepare common SQL statements for use, as a matter of convention the # parameters to each statement always appear in the following order: # # user # bucket # word # parameter $self->{db_get_buckets__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select name, id, pseudo from buckets where buckets.userid = ?;' ); # PROFILE BLOCK STOP $self->{db_get_wordid__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select id from words where words.word = ? limit 1;' ); # PROFILE BLOCK STOP $self->{db_get_userid__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select id from users where name = ? and password = ? limit 1;' ); # PROFILE BLOCK STOP $self->{db_get_word_count__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select matrix.times from matrix where matrix.bucketid = ? and matrix.wordid = ? limit 1;' ); # PROFILE BLOCK STOP $self->{db_put_word_count__} = $self->{db__}->prepare( # PROFILE BLOCK START 'replace into matrix ( bucketid, wordid, times ) values ( ?, ?, ? );' ); # PROFILE BLOCK STOP $self->{db_get_bucket_word_counts__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select sum(matrix.times), count(matrix.id), buckets.name from matrix, buckets where matrix.bucketid = buckets.id and buckets.userid = ? group by buckets.name;' ); # PROFILE BLOCK STOP $self->{db_get_bucket_word_count__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select sum(times), count(*) from matrix where bucketid = ?' ); # PROFILE BLOCK STOP $self->{db_get_unique_word_count__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select count(*) from matrix where matrix.bucketid in ( select buckets.id from buckets where buckets.userid = ? );' ); # PROFILE BLOCK STOP $self->{db_get_full_total__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select sum(matrix.times) from matrix where matrix.bucketid in ( select buckets.id from buckets where buckets.userid = ? );' ); # PROFILE BLOCK STOP $self->{db_get_bucket_parameter__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select bucket_params.val from bucket_params where bucket_params.bucketid = ? and bucket_params.btid = ?;' ); # PROFILE BLOCK STOP $self->{db_set_bucket_parameter__} = $self->{db__}->prepare( # PROFILE BLOCK START 'replace into bucket_params ( bucketid, btid, val ) values ( ?, ?, ? );' ); # PROFILE BLOCK STOP $self->{db_get_bucket_parameter_default__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select bucket_template.def from bucket_template where bucket_template.id = ?;' ); # PROFILE BLOCK STOP $self->{db_get_buckets_with_magnets__} = $self->{db__}->prepare( # PROFILE BLOCK START 'select buckets.name from buckets, magnets where buckets.userid = ? and magnets.id != 0 and magnets.bucketid = buckets.id group by buckets.name order by buckets.name;' ); # PROFILE BLOCK STOP $self->{db_delete_zero_words__} = $self->{db__}->prepare( # PROFILE BLOCK START 'delete from matrix where matrix.times = 0 and matrix.bucketid = ?;' ); # PROFILE BLOCK STOP # Get the mapping from parameter names to ids into a local hash my $h = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select name, id from bucket_template;' ); # PROFILE BLOCK STOP while ( my $row = $h->fetchrow_arrayref ) { $self->{db_parameterid__}{$row->[0]} = $row->[1]; } $h->finish; return 1; } #---------------------------------------------------------------------------- # # insert_schema__ # # Insert the POPFile schema in a database # # $sqlite Set to 1 if this is a SQLite database # #---------------------------------------------------------------------------- sub insert_schema__ { my ( $self, $sqlite ) = @_; if ( -e $self->get_root_path_( 'Classifier/popfile.sql' ) ) { my $schema = ''; $self->log_( 0, "Creating database schema" ); open SCHEMA, '<' . $self->get_root_path_( 'Classifier/popfile.sql' ); while ( ) { next if ( /^--/ ); next if ( !/[a-z;]/ ); s/--.*$//; # If the line begins 'alter' and we are doing SQLite then ignore # the line if ( $sqlite && ( /^alter/i ) ) { next; } $schema .= $_; if ( ( /end;/ ) || ( /\);/ ) || ( /^alter/i ) ) { $self->{db__}->do( $schema ); $schema = ''; } } close SCHEMA; return 1; } else { $self->log_( 0, "Can't find the database schema" ); return 0; } } #---------------------------------------------------------------------------- # # db_upgrade__ # # Upgrade the POPFile schema / Convert the database # # $db_from Database handle convert from # undef if upgrade POPFile schema # #---------------------------------------------------------------------------- sub db_upgrade__ { my ( $self, $db_from ) = @_; my $drop_table; if ( !defined( $db_from ) ) { # Upgrade $drop_table = 1; $db_from = $self->{db__}; } my $from_sqlite = ( $db_from->{Driver}->{Name} =~ /SQLite/ ); my $to_sqlite = ( $self->{db__}->{Driver}->{Name} =~ /SQLite/ ); my $sqlquotechar = $db_from->get_info(29) || ''; my @tables = map { s/$sqlquotechar//g; $_ } ($db_from->tables()); # We are going to dump out all the data in the database as # INSERT OR IGNORE statements in a temporary file, then DROP all # the tables in the database, then recreate the schema from the # new schema and finally rerun the inserts. my $i = 0; my $ins_file = $self->get_user_path_( 'insert.sql' ); open INSERT, '>' . $ins_file; foreach my $table (@tables) { next if ( $table =~ /\.?popfile$/ ); if ( $from_sqlite && ( $table =~ /^sqlite_/ ) ) { next; } if ( $i > 99 ) { print "\n"; } print " Saving table $table\n "; my $t = $db_from->prepare( "select * from $table;" ); $t->execute; $i = 0; while ( 1 ) { if ( ( ++$i % 100 ) == 0 ) { print "[$i]"; flush STDOUT; } if ( ( $i % 1000 ) == 0 ) { print "\n"; flush STDOUT; } my $rows = $t->fetchrow_arrayref; last if ( !defined( $rows ) ); if ( $to_sqlite ) { print INSERT "INSERT OR IGNORE INTO $table ("; } else { print INSERT "INSERT INTO $table ("; } for my $i (0..$t->{NUM_OF_FIELDS}-1) { if ( $i != 0 ) { print INSERT ','; } print INSERT $t->{NAME}->[$i]; } print INSERT ') VALUES ('; for my $i (0..$t->{NUM_OF_FIELDS}-1) { if ( $i != 0 ) { print INSERT ','; } my $val = $rows->[$i]; if ( $t->{TYPE}->[$i] !~ /^int/i ) { $val = '' if ( !defined( $val ) ); $val = $self->db_quote( $val ); } else { $val = 'NULL' if ( !defined( $val ) ); } print INSERT $val; } print INSERT ");\n"; } $t->finish; } close INSERT; if ( $i > 99 ) { print "\n"; } if ( $drop_table ) { foreach my $table (@tables) { if ( $from_sqlite && ( $table =~ /^sqlite_/ ) ) { next; } print " Dropping old table $table\n"; $self->{db__}->do( "DROP TABLE $table;" ); } } print " Inserting new database schema\n"; if ( !$self->insert_schema__( $to_sqlite ) ) { return 0; } print " Restoring old data\n "; $self->{db__}->begin_work; open INSERT, '<' . $ins_file; $i = 0; while ( ) { if ( ( ++$i % 100 ) == 0 ) { print "[$i]"; flush STDOUT; } if ( ( $i % 1000 ) == 0 ) { print "\n"; flush STDOUT; } s/[\r\n]//g; $self->{db__}->do( $_ ); } close INSERT; $self->{db__}->commit; unlink $ins_file; } #---------------------------------------------------------------------------- # # db_disconnect__ # # Disconnect from the POPFile database # #---------------------------------------------------------------------------- sub db_disconnect__ { my ( $self ) = @_; $self->{db_get_buckets__}->finish; $self->{db_get_wordid__}->finish; $self->{db_get_userid__}->finish; $self->{db_get_word_count__}->finish; $self->{db_put_word_count__}->finish; $self->{db_get_bucket_word_counts__}->finish; $self->{db_get_bucket_word_count__}->finish; $self->{db_get_unique_word_count__}->finish; $self->{db_get_full_total__}->finish; $self->{db_get_bucket_parameter__}->finish; $self->{db_set_bucket_parameter__}->finish; $self->{db_get_bucket_parameter_default__}->finish; $self->{db_get_buckets_with_magnets__}->finish; $self->{db_delete_zero_words__}->finish; # Avoid DBD::SQLite 'closing dbh with active statement handles' bug undef $self->{db_get_buckets__}; undef $self->{db_get_wordid__}; undef $self->{db_get_userid__}; undef $self->{db_get_word_count__}; undef $self->{db_put_word_count__}; undef $self->{db_get_bucket_word_counts__}; undef $self->{db_get_bucket_word_count__}; undef $self->{db_get_unique_word_count__}; undef $self->{db_get_full_total__}; undef $self->{db_get_bucket_parameter__}; undef $self->{db_set_bucket_parameter__}; undef $self->{db_get_bucket_parameter_default__}; undef $self->{db_get_buckets_with_magnets__}; undef $self->{db_delete_zero_words__}; if ( defined( $self->{db__} ) ) { $self->{db__}->disconnect; undef $self->{db__}; } } #---------------------------------------------------------------------------- # # db_update_cache__ # # Updates our local cache of user and bucket ids. # # $session Must be a valid session # $updated_bucket Bucket to update cache # $deleted_bucket Bucket to delete cache # If none of them is specified, update whole cache. # #---------------------------------------------------------------------------- sub db_update_cache__ { my ( $self, $session, $updated_bucket, $deleted_bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); delete $self->{db_bucketid__}{$userid}; $self->validate_sql_prepare_and_execute( $self->{db_get_buckets__}, $userid ); while ( my $row = $self->{db_get_buckets__}->fetchrow_arrayref ) { $self->{db_bucketid__}{$userid}{$row->[0]}{id} = $row->[1]; $self->{db_bucketid__}{$userid}{$row->[0]}{pseudo} = $row->[2]; } my $updated = 0; if ( defined( $updated_bucket ) && # PROFILE BLOCK START defined( $self->{db_bucketid__}{$userid}{$updated_bucket} ) ) { # PROFILE BLOCK STOP # Update cache for specified bucket. my $bucketid = $self->{db_bucketid__}{$userid}{$updated_bucket}{id}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_bucket_word_count__}, $bucketid ); # PROFILE BLOCK STOP my $row = $self->{db_get_bucket_word_count__}->fetchrow_arrayref; $self->{db_bucketcount__}{$userid}{$updated_bucket} = # PROFILE BLOCK START ( defined( $row->[0] ) ? $row->[0] : 0 ); # PROFILE BLOCK STOP $self->{db_bucketunique__}{$userid}{$updated_bucket} = $row->[1]; $updated = 1; } if ( defined( $deleted_bucket ) && # PROFILE BLOCK START !defined( $self->{db_bucketid__}{$userid}{$deleted_bucket} ) ) { # PROFILE BLOCK STOP # Delete cache for specified bucket. delete $self->{db_bucketcount__}{$userid}{$deleted_bucket}; delete $self->{db_bucketunique__}{$userid}{$deleted_bucket}; $updated = 1; } if ( !$updated ) { delete $self->{db_bucketcount__}{$userid}; delete $self->{db_bucketunique__}{$userid}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_bucket_word_counts__}, $userid ); # PROFILE BLOCK STOP for my $b (sort keys %{$self->{db_bucketid__}{$userid}}) { $self->{db_bucketcount__}{$userid}{$b} = 0; $self->{db_bucketunique__}{$userid}{$b} = 0; } while ( my $row = $self->{db_get_bucket_word_counts__}->fetchrow_arrayref ) { $self->{db_bucketcount__}{$userid}{$row->[2]} = $row->[0]; $self->{db_bucketunique__}{$userid}{$row->[2]} = $row->[1]; } } $self->update_constants__( $session ); } #---------------------------------------------------------------------------- # # db_get_word_count__ # # Return the 'count' value for a word in a bucket. If the word is not # found in that bucket then returns undef. # # $session Valid session ID from get_session_key # $bucket bucket word is in # $word word to lookup # #---------------------------------------------------------------------------- sub db_get_word_count__ { my ( $self, $session, $bucket, $word ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_wordid__}, $word ); # PROFILE BLOCK STOP my $result = $self->{db_get_wordid__}->fetchrow_arrayref; if ( !defined( $result ) ) { return undef; } my $wordid = $result->[0]; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_word_count__}, $self->{db_bucketid__}{$userid}{$bucket}{id}, $wordid ); # PROFILE BLOCK STOP $result = $self->{db_get_word_count__}->fetchrow_arrayref; if ( defined( $result ) ) { return $result->[0]; } else { return undef; } } #---------------------------------------------------------------------------- # # db_put_word_count__ # # Update 'count' value for a word in a bucket, if the update fails # then returns 0 otherwise is returns 1 # # $session Valid session ID from get_session_key # $bucket bucket word is in # $word word to update # $count new count value # #---------------------------------------------------------------------------- sub db_put_word_count__ { my ( $self, $session, $bucket, $word, $count ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # We need to have two things before we can start, the id of the # word in the words table (if there's none then we need to add the # word), the bucket id in the buckets table (which must exist) my $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_wordid__}, $word )->fetchrow_arrayref; # PROFILE BLOCK STOP if ( !defined( $result ) ) { $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'insert into words ( word ) values ( ? );', $word ); # PROFILE BLOCK STOP $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_wordid__}, $word )->fetchrow_arrayref; # PROFILE BLOCK STOP } my $wordid = $result->[0]; my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_put_word_count__}, $bucketid, $wordid, $count ); # PROFILE BLOCK STOP return 1; } #---------------------------------------------------------------------------- # # upgrade_predatabase_data__ # # Looks for old POPFile data (in flat files or BerkeleyDB tables) and # upgrades it to the SQL database. Data upgraded is removed. # #---------------------------------------------------------------------------- sub upgrade_predatabase_data__ { my ( $self ) = @_; my $c = 0; # There's an assumption here that this is the single user version # of POPFile and hence what we do is cheat and get a session key # assuming that the user name is admin with password '' my $session = $self->get_session_key( 'admin', '' ); if ( !defined( $session ) ) { $self->log_( 0, "Tried to get the session key for user admin and failed; cannot upgrade old data" ); return; } my @buckets = glob $self->get_user_path_( $self->config_( 'corpus' ) . '/*' ); foreach my $bucket (@buckets) { # A bucket directory must be a directory next unless ( -d $bucket ); next unless ( ( -e "$bucket/table" ) || ( -e "$bucket/table.db" ) ); return 0 if ( !$self->upgrade_bucket__( $session, $bucket ) ); my $color = ''; # See if there's a color file specified if ( open COLOR, '<' . "$bucket/color" ) { $color = ; # Someone (who shall remain nameless) went in and manually created # empty color files in their corpus directories which would cause # $color at this point to be undefined and hence you'd get warnings # about undefined variables below. So this little test is to deal # with that user and to make POPFile a little safer which is always # a good thing if ( !defined( $color ) ) { $color = ''; } else { $color =~ s/[\r\n]//g; } close COLOR; unlink "$bucket/color"; } $bucket =~ /([[:alpha:]0-9-_]+)$/; $bucket = $1; $self->set_bucket_color( $session, $bucket, ($color eq '')?$self->{possible_colors__}[$c]:$color ); $c = ($c+1) % ($#{$self->{possible_colors__}}+1); } $self->release_session_key( $session ); return 1; } #---------------------------------------------------------------------------- # # upgrade_bucket__ # # Loads an individual bucket # # $session Valid session key from get_session_key # $bucket The bucket name # #---------------------------------------------------------------------------- sub upgrade_bucket__ { my ( $self, $session, $bucket ) = @_; $bucket =~ /([[:alpha:]0-9-_]+)$/; $bucket = $1; $self->create_bucket( $session, $bucket ); if ( open PARAMS, '<' . $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/params" ) ) { while ( ) { s/[\r\n]//g; if ( /^([[:lower:]]+) ([^\r\n\t ]+)$/ ) { $self->set_bucket_parameter( $session, $bucket, $1, $2 ); } } close PARAMS; unlink $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/params" ); } # Pre v0.21.0 POPFile had GLOBAL parameters for subject modification, # XTC and XPL insertion. To make the upgrade as clean as possible # check these parameters so that if they were OFF we set the equivalent # per bucket to off foreach my $gl ( 'subject', 'xtc', 'xpl' ) { $self->log_( 1, "Checking deprecated parameter GLOBAL_$gl for $bucket\n" ); my $val = $self->{configuration__}->deprecated_parameter( "GLOBAL_$gl" ); if ( defined( $val ) && ( $val == 0 ) ) { $self->log_( 1, "GLOBAL_$gl is 0 for $bucket, overriding $gl\n" ); $self->set_bucket_parameter( $session, $bucket, $gl, 0 ); } } # See if there are magnets defined if ( open MAGNETS, '<' . $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/magnets" ) ) { while ( ) { s/[\r\n]//g; # Because of a bug in v0.17.9 and earlier of POPFile the text of # some magnets was getting mangled by certain characters having # a \ prepended. Code here removes the \ in these cases to make # an upgrade smooth. if ( /^([^ ]+) (.+)$/ ) { my $type = $1; my $value = $2; # Some people were accidently creating magnets with # trailing whitespace which really confused them later # when their magnet did not match (see comment in # UI::HTML::magnet for more detail) $value =~ s/^[ \t]+//g; $value =~ s/[ \t]+$//g; $value =~ s/\\(\?|\*|\||\(|\)|\[|\]|\{|\}|\^|\$|\.)/$1/g; $self->create_magnet( $session, $bucket, $type, $value ); } else { # This branch is used to catch the original magnets in an # old version of POPFile that were just there for from # addresses only if ( /^(.+)$/ ) { my $value = $1; $value =~ s/\\(\?|\*|\||\(|\)|\[|\]|\{|\}|\^|\$|\.)/$1/g; $self->create_magnet( $session, $bucket, 'from', $value ); } } } close MAGNETS; unlink $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/magnets" ); } # If there is no existing table but there is a table file (the old style # flat file used by POPFile for corpus storage) then create the new # database from it thus performing an automatic upgrade. if ( -e $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/table" ) ) { $self->log_( 0, "Performing automatic upgrade of $bucket corpus from flat file to DBI" ); $self->{db__}->begin_work; if ( open WORDS, '<' . $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/table" ) ) { my $wc = 1; my $first = ; if ( defined( $first ) && ( $first =~ s/^__CORPUS__ __VERSION__ (\d+)// ) ) { if ( $1 != $self->{corpus_version__} ) { print STDERR "Incompatible corpus version in $bucket\n"; close WORDS; $self->{db__}->rollback; return 0; } else { $self->log_( 0, "Upgrading bucket $bucket..." ); while ( ) { if ( $wc % 100 == 0 ) { $self->log_( 0, "$wc" ); } $wc += 1; s/[\r\n]//g; if ( /^([^\s]+) (\d+)$/ ) { if ( $2 != 0 ) { $self->db_put_word_count__( $session, $bucket, $1, $2 ); } } else { $self->log_( 0, "Found entry in corpus for $bucket that looks wrong: \"$_\" (ignoring)" ); } } } if ( $wc > 1 ) { $wc -= 1; $self->log_( 0, "(completed $wc words)" ); } close WORDS; } else { close WORDS; $self->{db__}->rollback; unlink $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/table" ); return 0; } $self->{db__}->commit; unlink $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/table" ); } } # Now check to see if there's a BerkeleyDB-style table my $bdb_file = $self->get_user_path_( $self->config_( 'corpus' ) . "/$bucket/table.db" ); if ( -e $bdb_file ) { $self->log_( 0, "Performing automatic upgrade of $bucket corpus from BerkeleyDB to DBI" ); require BerkeleyDB; my %h; tie %h, "BerkeleyDB::Hash", -Filename => $bdb_file; $self->log_( 0, "Upgrading bucket $bucket..." ); $self->{db__}->begin_work; my $wc = 1; for my $word (keys %h) { if ( $wc % 100 == 0 ) { $self->log_( 0, "$wc" ); } next if ( $word =~ /__POPFILE__(LOG__TOTAL|TOTAL|UNIQUE)__/ ); $wc += 1; if ( $h{$word} != 0 ) { $self->db_put_word_count__( $session, $bucket, $word, $h{$word} ); } } $wc -= 1; $self->log_( 0, "(completed $wc words)" ); $self->{db__}->commit; untie %h; unlink $bdb_file; } return 1; } #---------------------------------------------------------------------------- # # magnet_match_helper__ # # Helper the determines if a specific string matches a certain magnet # type in a bucket, used by magnet_match_ # # $session Valid session from get_session_key # $match The string to match # $bucket The bucket to check # $type The magnet type to check # #---------------------------------------------------------------------------- sub magnet_match_helper__ { my ( $self, $session, $match, $bucket, $type ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @magnets; my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $h = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnets.val, magnets.id from magnets, users, buckets, magnet_types where buckets.id = ? and magnets.id != 0 and users.id = buckets.userid and magnets.bucketid = buckets.id and magnet_types.mtype = ? and magnets.mtid = magnet_types.id order by magnets.val;', $bucketid, $type ); # PROFILE BLOCK STOP my ( $val, $id ); $h->bind_columns( \$val, \$id ); while ( my $row = $h->fetchrow_arrayref ) { push @magnets, [ $val, $id ]; } $h->finish; foreach my $m (@magnets) { my ( $magnet, $id ) = @{$m}; if ( $self->single_magnet_match( $magnet, $match, $type ) ) { $self->{magnet_used__} = 1; $self->{magnet_detail__} = $id; return 1; } } return 0; } #---------------------------------------------------------------------------- # # single_magnet_match # # Helper the determines if a specific string matches a specific magnet # # $magnet The magnet string # $match The string to match # $type The magnet type to check # #---------------------------------------------------------------------------- sub single_magnet_match { my ( $self, $magnet, $match, $type ) = @_; my $matched = 0; if ( $type =~ /^(from|to)$/ ) { # From / To if ( $magnet =~ /[\w]+\@[\w]+/ ) { # e-mail address -> exact match $matched = 1 if ( $match =~ m/(^|[^\w\-])\Q$magnet\E($|[^\w\.])/i ); } elsif ( $magnet =~ /\./ ) { # domain name -> domain match if ( $magnet =~ /^[\@\.]/ ) { $matched = 1 if ( $match =~ /\Q$magnet\E($|[^\w\.])/i ); } else { $matched = 1 if ( $match =~ m/[\@\.]\Q$magnet\E($|[^\w\.])/i ); } } else { # name -> word match $matched = 1 if ( $match =~ m/(^|[^\w])\Q$magnet\E($|[^\w])/i ); } } else { # Subject -> word match $matched = 1 if ( $match =~ m/(^|[^\w])\Q$magnet\E($|[^\w])/i ); } return $matched; } #---------------------------------------------------------------------------- # # magnet_match__ # # Helper the determines if a specific string matches a certain magnet # type in a bucket # # $session Valid session from get_session_key # $match The string to match # $bucket The bucket to check # $type The magnet type to check # #---------------------------------------------------------------------------- sub magnet_match__ { my ( $self, $session, $match, $bucket, $type ) = @_; return $self->magnet_match_helper__( $session, $match, $bucket, $type ); } #---------------------------------------------------------------------------- # # write_line__ # # Writes a line to a file and parses it unless the classification is # already known # # $file File handle for file to write line to # $line The line to write # $class (optional) The current classification # #---------------------------------------------------------------------------- sub write_line__ { my ( $self, $file, $line, $class ) = @_; if ( defined( $file ) && ( ref $file eq 'GLOB' ) ) { if ( defined( fileno $file ) ) { print $file $line; } else { my ( $package, $filename, $line, $subroutine ) = caller; $self->log_( 0, "Tried to write to a closed file. Called from $package line $line" ); } } if ( $class eq '' ) { $self->{parser__}->parse_line( $line ); } } #---------------------------------------------------------------------------- # # add_words_to_bucket__ # # Takes words previously parsed by the mail parser and adds/subtracts # them to/from a bucket, this is a helper used by # add_messages_to_bucket, remove_message_from_bucket # # $session Valid session from get_session_key # $bucket Bucket to add to # $subtract Set to -1 means subtract the words, set to 1 means add # #---------------------------------------------------------------------------- sub add_words_to_bucket__ { my ( $self, $session, $bucket, $subtract ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Map the list of words to a list of counts currently in the database # then update those counts and write them back to the database. my $words; $words = join( ',', map( $self->{db__}->quote( $_ ), (sort keys %{$self->{parser__}{words__}}) ) ); $self->{get_wordids__} = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START "select id, word from words where word in ( $words );" ); # PROFILE BLOCK STOP my @id_list; my %wordmap; my ( $wordid, $word ); $self->{get_wordids__}->bind_columns( \$wordid, \$word ); while ( $self->{get_wordids__}->fetchrow_arrayref ) { push @id_list, $wordid; $wordmap{$word} = $wordid; } $self->{get_wordids__}->finish; undef $self->{get_wordids__}; my $ids = join( ',', @id_list ); $self->{db_getwords__} = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START "select matrix.times, matrix.wordid from matrix where matrix.wordid in ( $ids ) and matrix.bucketid = ?;", $self->{db_bucketid__}{$userid}{$bucket}{id} ); # PROFILE BLOCK STOP my %counts; my $count; $self->{db_getwords__}->bind_columns( \$count, \$wordid ); while ( $self->{db_getwords__}->fetchrow_arrayref ) { $counts{$wordid} = $count; } $self->{db_getwords__}->finish; undef $self->{db_getwords__}; $self->{db__}->begin_work; foreach my $word (keys %{$self->{parser__}->{words__}}) { # If there's already a count then it means that the word is # already in the database and we have its id in # $wordmap{$word} so for speed we execute the # db_put_word_count__ query here rather than going through # set_value_ which would need to look up the wordid again if ( defined( $wordmap{$word} ) && defined( $counts{$wordmap{$word}} ) ) { $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_put_word_count__}, $self->{db_bucketid__}{$userid}{$bucket}{id}, $wordmap{$word}, $counts{$wordmap{$word}} + $subtract * $self->{parser__}->{words__}{$word} ); # PROFILE BLOCK STOP } else { # If the word is not in the database and we are trying to # subtract then we do nothing because negative values are # meaningless if ( $subtract == 1 ) { $self->db_put_word_count__( $session, $bucket, $word, $self->{parser__}->{words__}{$word} ); } } } # If we were doing a subtract operation it's possible that some of # the words in the bucket now have a zero count and should be # removed if ( $subtract == -1 ) { $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_delete_zero_words__}, $self->{db_bucketid__}{$userid}{$bucket}{id} ); # PROFILE BLOCK STOP } $self->{db__}->commit; } #---------------------------------------------------------------------------- # # echo_to_dot_ # # $mail The stream (created with IO::) to send the message to (the # remote mail server) # $client (optional) The local mail client (created with IO::) that # needs the response # $file (optional) A file to print the response to, caller specifies # open style # $before (optional) String to send to client before the dot is sent # # echo all information from the $mail server until a single line with # a . is seen # # NOTE Also echoes the line with . to $client but not to $file # # Returns 1 if there was a . or 0 if reached EOF before we hit the . # #---------------------------------------------------------------------------- sub echo_to_dot_ { my ( $self, $mail, $client, $file, $before ) = @_; my $hit_dot = 0; my $isopen = open FILE, "$file" if ( defined( $file ) ); binmode FILE if ($isopen); while ( my $line = $self->slurp_( $mail ) ) { # Check for an abort last if ( $self->{alive_} == 0 ); # The termination has to be a single line with exactly a dot # on it and nothing else other than line termination # characters. This is vital so that we do not mistake a line # beginning with . as the end of the block if ( $line =~ /^\.(\r\n|\r|\n)$/ ) { $hit_dot = 1; if ( defined( $before ) && ( $before ne '' ) ) { print $client $before if ( defined( $client ) ); print FILE $before if ( defined( $isopen ) ); } # Note that there is no print FILE here. This is correct # because we do no want the network terminator . to appear # in the file version of any message print $client $line if ( defined( $client ) ); last; } print $client $line if ( defined( $client ) ); print FILE $line if ( defined( $isopen ) ); } close FILE if ( $isopen ); return $hit_dot; } #---------------------------------------------------------------------------- # # substr_euc__ # # "substr" function which supports EUC Japanese charset # # $pos Start position # $len Word length # #---------------------------------------------------------------------------- sub substr_euc__ { my ( $str, $pos, $len ) = @_; my $result_str; my $char; my $count = 0; if ( !$pos ) { $pos = 0; } if ( !$len ) { $len = length( $str ); } for ( $pos = 0; $count < $len; $pos++ ) { $char = substr( $str, $pos, 1 ); if ( $char =~ /[\x80-\xff]/ ) { $char = substr( $str, $pos++, 2 ); } $result_str .= $char; $count++; } return $result_str; } #---------------------------------------------------------------------------- # # generate_unique_session_key__ # # Returns a unique string based session key that can be used as a key # in the api_sessions__ # #---------------------------------------------------------------------------- sub generate_unique_session_key__ { my ( $self ) = @_; my @chars = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', # PROFILE BLOCK START 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A' ); # PROFILE BLOCK STOP my $session; do { $session = ''; my $length = int( 16 + rand(4) ); for my $i (0 .. $length) { my $random = $chars[int( rand(36) )]; # Just to add spice to things we sometimes lowercase the value if ( rand(1) < rand(1) ) { $random = lc($random); } $session .= $random; } } while ( defined( $self->{api_sessions__}{$session} ) ); return $session; } #---------------------------------------------------------------------------- # # release_session_key_private__ # # $session A session key previously returned by get_session_key # # Releases and invalidates the session key. Worker function that does # the work of release_session_key. # # **** DO NOT CALL DIRECTLY **** # # unless you want your session key released immediately, possibly # preventing asynchronous tasks from completing # #---------------------------------------------------------------------------- sub release_session_key_private__ { my ( $self, $session ) = @_; if ( defined( $self->{api_sessions__}{$session} ) ) { $self->log_( 1, "release_session_key releasing key $session for user $self->{api_sessions__}{$session}" ); delete $self->{api_sessions__}{$session}; } } #---------------------------------------------------------------------------- # # valid_session_key__ # # $session Session key returned by call to get_session_key # # Returns undef is the session key is not valid, or returns the user # ID associated with the session key which can be used in database # accesses # #---------------------------------------------------------------------------- sub valid_session_key__ { my ( $self, $session ) = @_; # This provides protection against someone using the XML-RPC # interface and calling this API directly to fish for session # keys, this must be called from within this module return undef if ( caller ne 'Classifier::Bayes' ); # If the session key is invalid then wait 1 second. This is done # to prevent people from calling a POPFile API such as # get_bucket_count with random session keys fishing for a valid # key. The XML-RPC API is single threaded and hence this will # delay all use of that API by one second. Of course in normal # use when the user knows the username/password or session key # then there is no delay if ( !defined( $self->{api_sessions__}{$session} ) ) { my ( $package, $filename, $line, $subroutine ) = caller; $self->log_( 0, "Invalid session key $session provided in $package @ $line" ); select( undef, undef, undef, 1 ); } return $self->{api_sessions__}{$session}; } #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # _____ _____ _____ _______ _____ _______ _______ _____ _____ #|_____] | | |_____] |______ | | |______ |_____| |_____] | #| |_____| | | __|__ |_____ |______ | | | __|__ # # The method below are public and may be accessed by other modules. # All of them may be accessed remotely through the XMLRPC.pm module # using the XML-RPC protocol # # Note that every API function expects to be passed a $session which # is obtained by first calling get_session_key with a valid username # and password. Once done call the method release_session_key. # # See POPFile::API for more details # #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # # get_session_key # # $user The name of an existing user # $pwd The user's password # # Returns a string based session key if the username and password # match, or undef if not # #---------------------------------------------------------------------------- sub get_session_key { my ( $self, $user, $pwd ) = @_; # The password is stored in the database as an MD5 hash of the # username and password concatenated and separated by the string # __popfile__, so compute the hash here my $hash = md5_hex( $user . '__popfile__' . $pwd ); $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_userid__}, $user, $hash ); # PROFILE BLOCK STOP my $result = $self->{db_get_userid__}->fetchrow_arrayref; if ( !defined( $result ) ) { # The delay of one second here is to prevent people from trying out # username/password combinations at high speed to determine the # credentials of a valid user $self->log_( 0, "Attempt to login with incorrect credentials for user $user" ); select( undef, undef, undef, 1 ); return undef; } my $session = $self->generate_unique_session_key__(); $self->{api_sessions__}{$session} = $result->[0]; $self->db_update_cache__( $session ); $self->log_( 1, "get_session_key returning key $session for user $self->{api_sessions__}{$session}" ); return $session; } #---------------------------------------------------------------------------- # # release_session_key # # $session A session key previously returned by get_session_key # # Releases and invalidates the session key # #---------------------------------------------------------------------------- sub release_session_key { my ( $self, $session ) = @_; $self->mq_post_( "RELSE", $session ); } #---------------------------------------------------------------------------- # # get_top_bucket__ # # Helper function used by classify to get the bucket with the highest # score from data stored in a matrix of information (see definition of # %matrix in classify for details) and a list of potential buckets # # $userid User ID for database access # $id ID of a word in $matrix # $matrix Reference to the %matrix hash in classify # $buckets Reference to a list of buckets # # Returns the bucket in $buckets with the highest score # #---------------------------------------------------------------------------- sub get_top_bucket__ { my ( $self, $userid, $id, $matrix, $buckets ) = @_; my $best_probability = 0; my $top_bucket = 'unclassified'; for my $bucket (@$buckets) { my $probability = 0; if ( defined($$matrix{$id}{$bucket}) && ( $$matrix{$id}{$bucket} > 0 ) ) { $probability = $$matrix{$id}{$bucket} / $self->{db_bucketcount__}{$userid}{$bucket}; } if ( $probability > $best_probability ) { $best_probability = $probability; $top_bucket = $bucket; } } return $top_bucket; } #---------------------------------------------------------------------------- # # classify # # $session A valid session key returned by a call to get_session_key # $file The name of the file containing the text to classify (or undef # to use the data already in the parser) # $templ Reference to the UI template used for word score display # $matrix (optional) Reference to a hash that will be filled with the # word matrix used in classification # $idmap (optional) Reference to a hash that will map word ids in the # $matrix to actual words # # Splits the mail message into valid words, then runs the Bayes # algorithm to figure out which bucket it belongs in. Returns the # bucket name # #---------------------------------------------------------------------------- sub classify { my ( $self, $session, $file, $templ, $matrix, $idmap ) = @_; my $msg_total = 0; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); $self->{unclassified__} = log( $self->config_( 'unclassified_weight' ) ); $self->{magnet_used__} = 0; $self->{magnet_detail__} = 0; if ( defined( $file ) ) { return undef if ( !-f $file ); $self->{parser__}->parse_file( $file, # PROFILE BLOCK START $self->global_config_( 'message_cutoff' ) ); # PROFILE BLOCK STOP } # Get the list of buckets my @buckets = $self->get_buckets( $session ); # If the user has not defined any buckets then we escape here # return unclassified return "unclassified" if ( $#buckets == -1 ); # If all of the user's buckets have no words then we escape here # return unclassified # $self->{not_likely__}{$userid} is 0 if word count is 0. # See: update_constants__() return "unclassified" if ( $self->{not_likely__}{$userid} == 0 ); # Check to see if this email should be classified based on a magnet for my $bucket ($self->get_buckets_with_magnets( $session )) { for my $type ($self->get_magnet_types_in_bucket( $session, $bucket )) { if ( $self->magnet_match__( $session, $self->{parser__}->get_header($type), $bucket, $type ) ) { return $bucket; } } } # The score hash will contain the likelihood that the given # message is in each bucket, the buckets are the keys for score # Set up the initial score as P(bucket) my %score; my %matchcount; # Build up a list of the buckets that are OK to use for # classification (i.e. that have at least one word in them). my @ok_buckets; for my $bucket (@buckets) { if ( defined $self->{bucket_start__}{$userid}{$bucket} && $self->{bucket_start__}{$userid}{$bucket} != 0 ) { $score{$bucket} = $self->{bucket_start__}{$userid}{$bucket}; $matchcount{$bucket} = 0; push @ok_buckets, ( $bucket ); } } @buckets = @ok_buckets; # If the user does not have at least two buckets which contains # some words then we escape here return unclassified return "unclassified" if ( $#buckets < 1 ); # For each word go through the buckets and calculate # P(word|bucket) and then calculate P(word|bucket) ^ word count # and multiply to the score my $word_count = 0; # The correction value is used to generate score displays variable # which are consistent with the word scores shown by the GUI's # word lookup feature. It is computed to make the contribution of # a word which is unrepresented in a bucket zero. This correction # affects only the values displayed in the display; it has no # effect on the classification process. my $correction = 0; # Classification against the database works in a sequence of steps # to get the fastest time possible. The steps are as follows: # # 1. Convert the list of words returned by the parser into a list # of unique word ids that can be used in the database. This # requires a select against the database to get the word ids # (and associated words) which is then converted into two # things: @id_list which is just the sorted list of word ids # and %idmap which maps a word to its id. # # 2. Then run a second select that get the triplet (count, id, # bucket) for each word id and each bucket. The triplet # contains the word count from the database for each bucket and # each id, where there is an entry. That data gets loaded into # the sparse matrix %matrix. # # 3. Do the normal classification loop as before running against # the @id_list for the words and for each bucket. If there's an # entry in %matrix for the id/bucket combination then calculate # the probability, otherwise use the not_likely probability. # # NOTE. Since there is a single not_likely probability we do not # worry about the fact that the select in 1 might return a shorter # list of words than was found in the message (because some words # are not in the database) since the missing words will be the # same for all buckets and hence constitute a fixed scaling factor # on all the buckets which is irrelevant in deciding which the # winning bucket is. my $words; $words = join( ',', map( $self->{db__}->quote( $_ ), (sort keys %{$self->{parser__}{words__}}) ) ); $self->{get_wordids__} = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START "select id, word from words where word in ( $words ) order by id;" ); # PROFILE BLOCK STOP my @id_list; my %temp_idmap; my ( $wordid, $word ); if ( !defined( $idmap ) ) { $idmap = \%temp_idmap; } $self->{get_wordids__}->bind_columns( \$wordid, \$word ); while ( $self->{get_wordids__}->fetchrow_arrayref ) { push @id_list, $wordid; $$idmap{$wordid} = $word; } $self->{get_wordids__}->finish; undef $self->{get_wordids__}; my $ids = join( ',', @id_list ); $self->{db_classify__} = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START "select matrix.times, matrix.wordid, buckets.name from matrix, buckets where matrix.wordid in ( $ids ) and matrix.bucketid = buckets.id and buckets.userid = ?;", $userid ); # PROFILE BLOCK STOP # %matrix maps wordids and bucket names to counts # $matrix{$wordid}{$bucket} == $count my %temp_matrix; my ( $count, $bucketname ); if ( !defined( $matrix ) ) { $matrix = \%temp_matrix; } $self->{db_classify__}->bind_columns( \$count, \$wordid, \$bucketname ); while ( $self->{db_classify__}->fetchrow_arrayref ) { $$matrix{$wordid}{$bucketname} = $count; } $self->{db_classify__}->finish; undef $self->{db_classify__}; my $not_likely = $self->{not_likely__}{$userid}; foreach my $id (@id_list) { $word_count += 2; my $wmax = -10000; my $count = $self->{parser__}{words__}{$$idmap{$id}}; foreach my $bucket (@buckets) { my $probability = $not_likely; if ( defined($$matrix{$id}{$bucket}) && ( $$matrix{$id}{$bucket} > 0 ) ) { $probability = log( $$matrix{$id}{$bucket} / $self->{db_bucketcount__}{$userid}{$bucket} ); $matchcount{$bucket} += $count; } $wmax = $probability if ( $wmax < $probability ); $score{$bucket} += ( $probability * $count ); } if ( $wmax > $not_likely ) { $correction += $not_likely * $count; } else { $correction += $wmax * $count; } } # Now sort the scores to find the highest and return that bucket # as the classification my @ranking = sort {$score{$b} <=> $score{$a}} keys %score; my %raw_score; my $base_score = defined $ranking[0] ? $score{$ranking[0]} : 0; my $total = 0; # If the first and second bucket are too close in their # probabilities, call the message unclassified. Also if there are # fewer than 2 buckets. my $class = 'unclassified'; if ( @buckets > 1 && $score{$ranking[0]} > ( $score{$ranking[1]} + $self->{unclassified__} ) ) { $class = $ranking[0]; } # Compute the total of all the scores to generate the normalized # scores and probability estimate. $total is always 1 after the # first loop iteration, so any additional term less than 2 ** -54 # is insignificant, and need not be computed. my $ln2p_54 = -54 * log(2); foreach my $b (@ranking) { $raw_score{$b} = $score{$b}; $score{$b} -= $base_score; $total += exp($score{$b}) if ($score{$b} > $ln2p_54 ); } if ($self->{wordscores__} && defined($templ) ) { my %qm = %{$self->{parser__}->quickmagnets()}; my $mlen = scalar(keys %{$self->{parser__}->quickmagnets()}); if ( $mlen > 0 ) { $templ->param( 'View_QuickMagnets_If' => 1 ); $templ->param( 'View_QuickMagnets_Count' => ($mlen + 1) ); my @buckets = $self->get_buckets( $session ); my $i = 0; my %types = $self->get_magnet_types( $session ); my @bucket_data; foreach my $bucket (@buckets) { my %row_data; $row_data{View_QuickMagnets_Bucket} = $bucket; $row_data{View_QuickMagnets_Bucket_Color} = $self->get_bucket_color( $session, $bucket ); push ( @bucket_data, \%row_data ); } my @qm_data; foreach my $type (sort keys %types) { my %row_data; if (defined $qm{$type}) { $i++; $row_data{View_QuickMagnets_Type} = $type; $row_data{View_QuickMagnets_I} = $i; $row_data{View_QuickMagnets_Loop_Buckets} = \@bucket_data; my @magnet_data; foreach my $magnet ( @{$qm{$type}} ) { my %row_magnet; $row_magnet{View_QuickMagnets_Magnet} = $magnet; push ( @magnet_data, \%row_magnet ); } $row_data{View_QuickMagnets_Loop_Magnets} = \@magnet_data; push ( @qm_data, \%row_data ); } } $templ->param( 'View_QuickMagnets_Loop' => \@qm_data ); } $templ->param( 'View_Score_If_Score' => $self->{wmformat__} eq 'score' ); my $log10 = log(10.0); my @score_data; foreach my $b (@ranking) { my %row_data; my $prob = exp($score{$b})/$total; my $probstr; my $rawstr; # If the computed probability would display as 1, display # it as .999999 instead. We don't want to give the # impression that POPFile is ever completely sure of its # classification. if ($prob >= .999999) { $probstr = sprintf("%12.6f", 0.999999); } else { if ($prob >= 0.1 || $prob == 0.0) { $probstr = sprintf("%12.6f", $prob); } else { $probstr = sprintf("%17.6e", $prob); } } my $color = $self->get_bucket_color( $session, $b ); $row_data{View_Score_Bucket} = $b; $row_data{View_Score_Bucket_Color} = $color; $row_data{View_Score_MatchCount} = $matchcount{$b}; $row_data{View_Score_ProbStr} = $probstr; if ( $self->{wmformat__} eq 'score' ) { $row_data{View_Score_If_Score} = 1; $rawstr = sprintf("%12.6f", ($raw_score{$b} - $correction)/$log10); $row_data{View_Score_RawStr} = $rawstr; } push ( @score_data, \%row_data ); } $templ->param( 'View_Score_Loop_Scores' => \@score_data ); if ( $self->{wmformat__} ne '' ) { $templ->param( 'View_Score_If_Table' => 1 ); my @header_data; foreach my $ix (0..($#buckets > 7? 7: $#buckets)) { my %row_data; my $bucket = $ranking[$ix]; my $bucketcolor = $self->get_bucket_color( $session, $bucket ); $row_data{View_Score_Bucket} = $bucket; $row_data{View_Score_Bucket_Color} = $bucketcolor; push ( @header_data, \%row_data ); } $templ->param( 'View_Score_Loop_Bucket_Header' => \@header_data ); my %wordprobs; # If the word matrix is supposed to show probabilities, # compute them, saving the results in %wordprobs. if ( $self->{wmformat__} eq 'prob' ) { foreach my $id (@id_list) { my $sumfreq = 0; my %wval; foreach my $bucket (@ranking) { $wval{$bucket} = $$matrix{$id}{$bucket} || 0; $sumfreq += $wval{$bucket}; } # If $sumfreq is still zero then this word didn't # appear in any buckets so we shouldn't create # wordprobs entries for it if ( $sumfreq != 0 ) { foreach my $bucket (@ranking) { $wordprobs{$bucket,$id} = $wval{$bucket} / $sumfreq; } } } } my @ranked_ids; if ( $self->{wmformat__} eq 'prob' ) { @ranked_ids = sort {($wordprobs{$ranking[0],$b}||0) <=> ($wordprobs{$ranking[0],$a}||0)} @id_list; } else { @ranked_ids = sort {($$matrix{$b}{$ranking[0]}||0) <=> ($$matrix{$a}{$ranking[0]}||0)} @id_list; } my @word_data; my %chart; foreach my $id (@ranked_ids) { my %row_data; my $known = 0; foreach my $bucket (@ranking) { if ( defined( $$matrix{$id}{$bucket} ) ) { $known = 1; last; } } if ( $known == 1 ) { my $wordcolor = $self->get_bucket_color( $session, $self->get_top_bucket__( $userid, $id, $matrix, \@ranking ) ); my $count = $self->{parser__}->{words__}{$$idmap{$id}}; $row_data{View_Score_Word} = $$idmap{$id}; $row_data{View_Score_Word_Color} = $wordcolor; $row_data{View_Score_Word_Count} = $count; my $base_probability = 0; if ( defined($$matrix{$id}{$ranking[0]}) && ( $$matrix{$id}{$ranking[0]} > 0 ) ) { $base_probability = log( $$matrix{$id}{$ranking[0]} / $self->{db_bucketcount__}{$userid}{$ranking[0]} ); } my @per_bucket; my @score; foreach my $ix (0..($#buckets > 7? 7: $#buckets)) { my %bucket_row; my $bucket = $ranking[$ix]; my $probability = 0; if ( defined($$matrix{$id}{$bucket}) && ( $$matrix{$id}{$bucket} > 0 ) ) { $probability = log( $$matrix{$id}{$bucket} / $self->{db_bucketcount__}{$userid}{$bucket} ); } my $color = 'black'; if ( $probability >= $base_probability || $base_probability == 0 ) { $color = $self->get_bucket_color( $session, $bucket ); } $bucket_row{View_Score_If_Probability} = ( $probability != 0 ); $bucket_row{View_Score_Word_Color} = $color; if ( $probability != 0 ) { my $wordprobstr; if ($self->{wmformat__} eq 'score') { $wordprobstr = sprintf("%12.4f", ($probability - $self->{not_likely__}{$userid})/$log10 ); push ( @score, $wordprobstr ); } else { if ($self->{wmformat__} eq 'prob') { $wordprobstr = sprintf("%12.4f", $wordprobs{$bucket,$id}); } else { $wordprobstr = sprintf("%13.5f", exp($probability) ); } } $bucket_row{View_Score_Probability} = $wordprobstr; } else { # Scores eq 0 must also be remembered. push @score, 0; } push ( @per_bucket, \%bucket_row ); } $row_data{View_Score_Loop_Per_Bucket} = \@per_bucket; # If we are doing the word scores then we build up # a hash that maps the name of a word to a value # which is the difference between the word scores # for the top two buckets. We later use this to # draw a chart if ( $self->{wmformat__} eq 'score' ) { $chart{$$idmap{$id}} = ( $score[0] || 0 ) - ( $score[1] || 0 ); } push ( @word_data, \%row_data ); } } $templ->param( 'View_Score_Loop_Words' => \@word_data ); if ( $self->{wmformat__} eq 'score' ) { # Draw a chart that shows how the decision between the top # two buckets was made. my @words = sort { $chart{$b} <=> $chart{$a} } keys %chart; my @chart_data; my $max_chart = $chart{$words[0]}; my $min_chart = $chart{$words[$#words]}; my $scale = ( $max_chart > $min_chart ) ? 400 / ( $max_chart - $min_chart ) : 0; my $color_1 = $self->get_bucket_color( $session, $ranking[0] ); my $color_2 = $self->get_bucket_color( $session, $ranking[1] ); $templ->param( 'Bucket_1' => $ranking[0] ); $templ->param( 'Bucket_2' => $ranking[1] ); $templ->param( 'Color_Bucket_1' => $color_1 ); $templ->param( 'Color_Bucket_2' => $color_2 ); $templ->param( 'Score_Bucket_1' => sprintf("%.3f", ($raw_score{$ranking[0]} - $correction)/$log10) ); $templ->param( 'Score_Bucket_2' => sprintf("%.3f", ($raw_score{$ranking[1]} - $correction)/$log10) ); for ( my $i=0; $i <= $#words; $i++ ) { my $word_1 = $words[$i]; my $word_2 = $words[$#words - $i]; my $width_1 = int( $chart{$word_1} * $scale + .5 ); my $width_2 = int( $chart{$word_2} * $scale - .5 ) * -1; last if ( $width_1 <=0 && $width_2 <= 0 ); my %row_data; $row_data{View_Chart_Word_1} = $word_1; if ( $width_1 > 0 ) { $row_data{View_If_Bar_1} = 1; $row_data{View_Width_1} = $width_1; $row_data{View_Color_1} = $color_1; $row_data{Score_Word_1} = sprintf "%.3f", $chart{$word_1}; } else { $row_data{View_If_Bar_1} = 0; } $row_data{View_Chart_Word_2} = $word_2; if ( $width_2 > 0 ) { $row_data{View_If_Bar_2} = 1; $row_data{View_Width_2} = $width_2; $row_data{View_Color_2} = $color_2; $row_data{Score_Word_2} = sprintf "%.3f", $chart{$word_2}; } else { $row_data{View_If_Bar_2} = 0; } push ( @chart_data, \%row_data ); } $templ->param( 'View_Loop_Chart' => \@chart_data ); $templ->param( 'If_chart' => 1 ); } else { $templ->param( 'If_chart' => 0 ); } } } return $class; } #---------------------------------------------------------------------------- # # classify_and_modify # # This method reads an email terminated by . on a line by itself (or # the end of stream) from a handle and creates an entry in the # history, outputting the same email on another handle with the # appropriate header modifications and insertions # # $session - A valid session key returned by a call to get_session_key # $mail - an open stream to read the email from # $client - an open stream to write the modified email to # $nosave - set to 1 indicates that this should not save to history # $class - if we already know the classification # $slot - Must be defined if $class is set # $echo - 1 to echo to the client, 0 to supress, defaults to 1 # $crlf - The sequence to use at the end of a line in the output, # normally this is left undefined and this method uses $eol (the # normal network end of line), but if this method is being used with # real files you may wish to pass in \n instead # # Returns a classification if it worked and the slot ID of the history # item related to this classification # # IMPORTANT NOTE: $mail and $client should be binmode # #---------------------------------------------------------------------------- sub classify_and_modify { my ( $self, $session, $mail, $client, $nosave, $class, $slot, $echo, $crlf ) = @_; $echo = 1 unless (defined $echo); $crlf = $eol unless (defined $crlf); my $msg_subject; # The message subject my $msg_head_before = ''; # Store the message headers that # come before Subject here my $msg_head_after = ''; # Store the message headers that # come after Subject here my $msg_head_q = ''; # Store questionable header lines here my $msg_body = ''; # Store the message body here my $in_subject_header = 0; # 1 if in Subject header # These two variables are used to control the insertion of the # X-POPFile-TimeoutPrevention header when downloading long or slow # emails my $last_timeout = time; my $timeout_count = 0; # Indicates whether the first time through the receive loop we got # the full body, this will happen on small emails my $got_full_body = 0; # The size of the message downloaded so far. my $message_size = 0; # The classification for this message my $classification = ''; # Whether we are currently reading the mail headers or not my $getting_headers = 1; # The maximum size of message to parse, or 0 for unlimited my $max_size = $self->global_config_( 'message_cutoff' ); $max_size = 0 if ( !defined( $max_size ) || ( $max_size =~ /\D/ ) ); my $msg_file; # If we don't yet know the classification then start the parser $class = '' if ( !defined( $class ) ); if ( $class eq '' ) { $self->{parser__}->start_parse(); ( $slot, $msg_file ) = $self->{history__}->reserve_slot(); } else { $msg_file = $self->{history__}->get_slot_file( $slot ); } # We append .TMP to the filename for the MSG file so that if we are in # middle of downloading a message and we refresh the history we do not # get class file errors if ( !$nosave ) { open MSG, ">$msg_file" or $self->log_( 0, "Could not open $msg_file : $!" ); } while ( my $line = $self->slurp_( $mail ) ) { my $fileline; # This is done so that we remove the network style end of line # CR LF and allow Perl to decide on the local system EOL which # it will expand out of \n when this gets written to the temp # file $fileline = $line; $fileline =~ s/[\r\n]//g; $fileline .= "\n"; # Check for an abort last if ( $self->{alive_} == 0 ); # The termination of a message is a line consisting of exactly # .CRLF so we detect that here exactly if ( $line =~ /^\.(\r\n|\r|\n)$/ ) { $got_full_body = 1; last; } if ( $getting_headers ) { # Kill header lines containing only whitespace (Exim does this) next if ( $line =~ /^[ \t]+(\r\n|\r|\n)$/i ); if ( !( $line =~ /^(\r\n|\r|\n)$/i ) ) { $message_size += length $line; $self->write_line__( $nosave?undef:\*MSG, $fileline, $class ); # If there is no echoing occuring, it doesn't matter # what we do to these if ( $echo ) { if ( $line =~ /^Subject:(.*)/i ) { $msg_subject = $1; $msg_subject =~ s/(\012|\015)//g; $in_subject_header = 1; next; } elsif ( $line !~ /^[ \t]/ ) { $in_subject_header = 0; } # Strip out the X-Text-Classification header that # is in an incoming message next if ( $line =~ /^X-Text-Classification:/i ); next if ( $line =~ /^X-POPFile-Link:/i ); # Store any lines that appear as though they may # be non-header content Lines that are headers # begin with whitespace or Alphanumerics and "-" # followed by a colon. # # This prevents weird things like HTML before the # headers terminate from causing the XPL and XTC # headers to be inserted in places some clients # can't detect if ( ( $line =~ /^[ \t]/ ) && $in_subject_header ) { $line =~ s/(\012|\015)//g; $msg_subject .= $crlf . $line; next; } if ( $line =~ /^([ \t]|([A-Z0-9\-_]+:))/i ) { if ( !defined($msg_subject) ) { $msg_head_before .= $msg_head_q . $line; } else { $msg_head_after .= $msg_head_q . $line; } $msg_head_q = ''; } else { # Gather up any header lines that are questionable $self->log_( 1, "Found odd email header: $line" ); $msg_head_q .= $line; } } } else { $self->write_line__( $nosave?undef:\*MSG, "\n", $class ); $message_size += length $crlf; $getting_headers = 0; } } else { $message_size += length $line; $msg_body .= $line; $self->write_line__( $nosave?undef:\*MSG, $fileline, $class ); } # Check to see if too much time has passed and we need to keep # the mail client happy if ( time > ( $last_timeout + 2 ) ) { print $client "X-POPFile-TimeoutPrevention: $timeout_count$crlf" if ( $echo ); $timeout_count += 1; $last_timeout = time; } last if ( ( $max_size > 0 ) && # PROFILE BLOCK START ( $message_size > $max_size ) && ( !$getting_headers ) ); # PROFILE BLOCK STOP } close MSG unless $nosave; # If we don't yet know the classification then stop the parser if ( $class eq '' ) { $self->{parser__}->stop_parse(); } # Do the text classification and update the counter for that # bucket that we just downloaded an email of that type $classification = ($class ne '')?$class:$self->classify( $session, undef); my $subject_modification = $self->get_bucket_parameter( $session, $classification, 'subject' ); my $xtc_insertion = $self->get_bucket_parameter( $session, $classification, 'xtc' ); my $xpl_insertion = $self->get_bucket_parameter( $session, $classification, 'xpl' ); my $quarantine = $self->get_bucket_parameter( $session, $classification, 'quarantine' ); my $modification = $self->config_( 'subject_mod_left' ) . $classification . $self->config_( 'subject_mod_right' ); # Add the Subject line modification or the original line back again # Don't add the classification unless it is not present my $original_msg_subject = $msg_subject; if ( $subject_modification ) { if ( !defined( $msg_subject ) ) { # PROFILE BLOCK START $msg_subject = " $modification"; } elsif ( $msg_subject !~ /\Q$modification\E/ ) { if ( $self->config_( 'subject_mod_pos' ) > 0 ) { # Beginning $msg_subject = " $modification$msg_subject"; } else { # End $msg_subject = "$msg_subject $modification"; } } # PROFILE BLOCK STOP } if ( $quarantine ) { if ( defined( $original_msg_subject ) ) { $msg_head_before .= "Subject:$original_msg_subject$crlf"; } } else { if ( defined( $msg_subject ) ) { $msg_head_before .= "Subject:$msg_subject$crlf"; } } # Add LF if $msg_head_after ends with CR to avoid header concatination $msg_head_after =~ s/\015\z/$crlf/; # Add the XTC header if ( ( $xtc_insertion ) && ( !$quarantine ) ) { $msg_head_after .= "X-Text-Classification: $classification$crlf"; } # Add the XPL header my $host = $self->module_config_( 'html', 'local' ) ? # PROFILE BLOCK START $self->config_( 'localhostname' ) || '127.0.0.1' : $self->config_( 'hostname' ); # PROFILE BLOCK STOP my $port = $self->module_config_( 'html', 'port' ); my $xpl = "http://$host:$port/jump_to_message?view=$slot"; $xpl = "<$xpl>" if ( $self->config_( 'xpl_angle' ) ); if ( ( $xpl_insertion ) && ( !$quarantine ) ) { $msg_head_after .= "X-POPFile-Link: $xpl$crlf"; } $msg_head_after .= $msg_head_q; $msg_head_after .= $crlf if ( !$getting_headers ); # Echo the text of the message to the client if ( $echo ) { # If the bucket is quarantined then we'll treat it specially # by changing the message header to contain information from # POPFile and wrapping the original message in a MIME encoding if ( $quarantine ) { my ( $orig_from, $orig_to, $orig_subject ) = ( $self->{parser__}->get_header('from'), $self->{parser__}->get_header('to'), $self->{parser__}->get_header('subject') ); my ( $encoded_from, $encoded_to ) = ( $orig_from, $orig_to ); if ( $self->{parser__}->{lang__} eq 'Nihongo' ) { require Encode; Encode::from_to( $orig_from, 'euc-jp', 'iso-2022-jp'); Encode::from_to( $orig_to, 'euc-jp', 'iso-2022-jp'); Encode::from_to( $orig_subject, 'euc-jp', 'iso-2022-jp'); $encoded_from = $orig_from; $encoded_to = $orig_to; $encoded_from =~ s/(\x1B\x24\x42.+\x1B\x28\x42)/"=?ISO-2022-JP?B?" . encode_base64($1,'') . "?="/eg; $encoded_to =~ s/(\x1B\x24\x42.+\x1B\x28\x42)/"=?ISO-2022-JP?B?" . encode_base64($1,'') . "?="/eg; } print $client "From: $encoded_from$crlf"; print $client "To: $encoded_to$crlf"; print $client "Date: " . $self->{parser__}->get_header( 'date' ) . "$crlf"; print $client "Subject:$msg_subject$crlf" if ( defined( $msg_subject ) ); print $client "X-Text-Classification: $classification$crlf" if ( $xtc_insertion ); print $client "X-POPFile-Link: $xpl$crlf" if ( $xpl_insertion ); print $client "MIME-Version: 1.0$crlf"; print $client "Content-Type: multipart/report; boundary=\"$slot\"$crlf$crlf--$slot$crlf"; print $client "Content-Type: text/plain"; print $client "; charset=iso-2022-jp" if ( $self->{parser__}->{lang__} eq 'Nihongo' ); print $client "$crlf$crlf"; print $client "POPFile has quarantined a message. It is attached to this email.$crlf$crlf"; print $client "Quarantined Message Detail$crlf$crlf"; print $client "Original From: $orig_from$crlf"; print $client "Original To: $orig_to$crlf"; print $client "Original Subject: $orig_subject$crlf"; print $client "To examine the email open the attachment. "; print $client "To change this mail's classification go to $xpl$crlf"; print $client "$crlf"; print $client "The first 20 words found in the email are:$crlf$crlf"; my $first20 = $self->{parser__}->first20(); if ( $self->{parser__}->{lang__} eq 'Nihongo' ) { require Encode; Encode::from_to( $first20, 'euc-jp', 'iso-2022-jp'); } print $client $first20; print $client "$crlf--$slot$crlf"; print $client "Content-Type: message/rfc822$crlf$crlf"; } print $client $msg_head_before; print $client $msg_head_after; print $client $msg_body; } my $before_dot = ''; if ( $quarantine && $echo ) { $before_dot = "$crlf--$slot--$crlf"; } my $need_dot = 0; if ( $got_full_body ) { $need_dot = 1; } else { $need_dot = !$self->echo_to_dot_( $mail, $echo?$client:undef, $nosave?undef:'>>' . $msg_file, $before_dot ) && !$nosave; } if ( $need_dot ) { print $client $before_dot if ( $before_dot ne '' ); print $client ".$crlf" if ( $echo ); } # In some cases it's possible (and totally illegal) to get a . in # the middle of the message, to cope with the we call flush_extra_ # here to remove any extra stuff the POP3 server is sending Make # sure to supress output if we are not echoing, and to save to # file if not echoing and saving if ( !($nosave || $echo) ) { # if we're saving (not nosave) and not echoing, we can safely # unload this into the temp file if (open FLUSH, ">$msg_file.flush") { binmode FLUSH; # TODO: Do this in a faster way (without flushing to one # file then copying to another) (perhaps a select on $mail # to predict if there is flushable data) $self->flush_extra_( $mail, \*FLUSH, 0 ); close FLUSH; # append any data we got to the actual temp file if ( ( (-s "$msg_file.flush") > 0 ) && # PROFILE BLOCK START ( open FLUSH, "<$msg_file.flush" ) ) { # PROFILE BLOCK STOP binmode FLUSH; if ( open TEMP, ">>$msg_file" ) { binmode TEMP; # The only time we get data here is if it is after # a CRLF.CRLF We have to re-create it to avoid # data-loss print TEMP ".$crlf"; print TEMP $_ while (); # NOTE: The last line flushed MAY be a CRLF.CRLF, # which isn't actually part of the message body close TEMP; } close FLUSH; } unlink("$msg_file.flush"); } } else { # if we are echoing, the client can make sure we have no data # loss otherwise, the data can be discarded (not saved and not # echoed) $self->flush_extra_( $mail, $client, $echo?0:1); } if ( $class eq '' ) { if ( $nosave ) { $self->{history__}->release_slot( $slot ); } else { $self->{history__}->commit_slot( $session, $slot, $classification, $self->{magnet_detail__} ); } } return ( $classification, $slot, $self->{magnet_used__} ); } #---------------------------------------------------------------------------- # # get_buckets # # Returns a list containing all the real bucket names sorted into # alphabetic order # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_buckets { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Note that get_buckets does not return pseudo buckets my @buckets; for my $b (sort keys %{$self->{db_bucketid__}{$userid}}) { if ( $self->{db_bucketid__}{$userid}{$b}{pseudo} == 0 ) { push @buckets, ($b); } } return @buckets; } #---------------------------------------------------------------------------- # # get_bucket_id # # Returns the internal ID for a bucket for database calls # # $session A valid session key returned by a call to get_session_key # $bucket The bucket name # #---------------------------------------------------------------------------- sub get_bucket_id { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return undef if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ); return $self->{db_bucketid__}{$userid}{$bucket}{id}; } #---------------------------------------------------------------------------- # # get_bucket_name # # Returns the name of a bucket from an internal ID # # $session A valid session key returned by a call to get_session_key # $id The bucket id # #---------------------------------------------------------------------------- sub get_bucket_name { my ( $self, $session, $id ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); foreach $b (keys %{$self->{db_bucketid__}{$userid}}) { if ( $id == $self->{db_bucketid__}{$userid}{$b}{id} ) { return $b; } } return ''; } #---------------------------------------------------------------------------- # # get_pseudo_buckets # # Returns a list containing all the pseudo bucket names sorted into # alphabetic order # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_pseudo_buckets { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @buckets; for my $b (sort keys %{$self->{db_bucketid__}{$userid}}) { if ( $self->{db_bucketid__}{$userid}{$b}{pseudo} == 1 ) { push @buckets, ($b); } } return @buckets; } #---------------------------------------------------------------------------- # # get_all_buckets # # Returns a list containing all the bucket names sorted into # alphabetic order # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_all_buckets { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @buckets; for my $b (sort keys %{$self->{db_bucketid__}{$userid}}) { push @buckets, ($b); } return @buckets; } #---------------------------------------------------------------------------- # # is_pseudo_bucket # # Returns 1 if the named bucket is pseudo # # $session A valid session key returned by a call to get_session_key # $bucket The bucket to check # #---------------------------------------------------------------------------- sub is_pseudo_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return ( defined($self->{db_bucketid__}{$userid}{$bucket}) # PROFILE BLOCK START && $self->{db_bucketid__}{$userid}{$bucket}{pseudo} ); # PROFILE BLOCK STOP } #---------------------------------------------------------------------------- # # is_bucket # # Returns 1 if the named bucket is a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The bucket to check # #---------------------------------------------------------------------------- sub is_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return ( ( defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) && # PROFILE BLOCK START ( !$self->{db_bucketid__}{$userid}{$bucket}{pseudo} ) ); # PROFILE BLOCK STOP } #---------------------------------------------------------------------------- # # get_bucket_word_count # # Returns the total word count (including duplicates) for the passed in bucket # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the word count is desired # #---------------------------------------------------------------------------- sub get_bucket_word_count { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $c = $self->{db_bucketcount__}{$userid}{$bucket}; return defined($c)?$c:0; } #---------------------------------------------------------------------------- # # get_bucket_word_list # # Returns a list of words all with the same first character # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the word count is desired # $prefix The first character of the words # #---------------------------------------------------------------------------- sub get_bucket_word_list { my ( $self, $session, $bucket, $prefix ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return undef if ( !exists( $self->{db_bucketid__}{$userid}{$bucket} ) ); my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; $prefix = '' if ( !defined( $prefix ) ); $prefix =~ s/\0//g; $prefix = $self->db_quote( "$prefix%" ); my $result = $self->{db__}->selectcol_arrayref( # PROFILE BLOCK START "select words.word from matrix, words where matrix.wordid = words.id and matrix.bucketid = $bucketid and words.word like $prefix;"); # PROFILE BLOCK STOP return @{$result}; } #---------------------------------------------------------------------------- # # get_bucket_word_prefixes # # Returns a list of all the initial letters of words in a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the word count is desired # #---------------------------------------------------------------------------- sub get_bucket_word_prefixes { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $prev = ''; my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $result = $self->{db__}->selectcol_arrayref( # PROFILE BLOCK START "select words.word from matrix, words where matrix.wordid = words.id and matrix.bucketid = $bucketid;"); # PROFILE BLOCK STOP if ( $self->module_config_( 'html', 'language' ) eq 'Nihongo' ) { return grep {$_ ne $prev && ($prev = $_, 1)} sort map {substr_euc__($_,0,1)} @{$result}; } else { if ( $self->module_config_( 'html', 'language' ) eq 'Korean' ) { return grep {$_ ne $prev && ($prev = $_, 1)} sort map {$_ =~ /([\x20-\x80]|$eksc)/} @{$result}; } else { return grep {$_ ne $prev && ($prev = $_, 1)} sort map {substr($_,0,1)} @{$result}; } } } #---------------------------------------------------------------------------- # # get_word_count # # Returns the total word count (including duplicates) # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_word_count { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $word_count = 0; foreach my $bucket ( keys %{$self->{db_bucketid__}{$userid}} ) { $word_count += $self->{db_bucketcount__}{$userid}{$bucket}; } return $word_count; } #---------------------------------------------------------------------------- # # get_count_for_word # # Returns the number of times the word occurs in a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The bucket we are asking about # $word The word we are asking about # #---------------------------------------------------------------------------- sub get_count_for_word { my ( $self, $session, $bucket, $word ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return $self->get_base_value_( $session, $bucket, $word ); } #---------------------------------------------------------------------------- # # get_bucket_unique_count # # Returns the unique word count (excluding duplicates) for the passed # in bucket # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the word count is desired # #---------------------------------------------------------------------------- sub get_bucket_unique_count { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $c = $self->{db_bucketunique__}{$userid}{$bucket}; return defined($c)?$c:0; } #---------------------------------------------------------------------------- # # get_unique_word_count # # Returns the unique word count (excluding duplicates) for all buckets # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_unique_word_count { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $unique_word_count = 0; foreach my $bucket ( keys %{$self->{db_bucketid__}{$userid}} ) { $unique_word_count += $self->{db_bucketunique__}{$userid}{$bucket}; } return $unique_word_count; } #---------------------------------------------------------------------------- # # get_bucket_color # # Returns the color associated with a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the color is requested # # NOTE This API is DEPRECATED in favor of calling get_bucket_parameter for # the parameter named 'color' #---------------------------------------------------------------------------- sub get_bucket_color { my ( $self, $session, $bucket ) = @_; return $self->get_bucket_parameter( $session, $bucket, 'color' ); } #---------------------------------------------------------------------------- # # set_bucket_color # # Returns the color associated with a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket for which the color is requested # $color The new color # # NOTE This API is DEPRECATED in favor of calling set_bucket_parameter for # the parameter named 'color' #---------------------------------------------------------------------------- sub set_bucket_color { my ( $self, $session, $bucket, $color ) = @_; return $self->set_bucket_parameter( $session, $bucket, 'color', $color ); } #---------------------------------------------------------------------------- # # get_bucket_parameter # # Returns the value of a per bucket parameter # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket # $parameter The name of the parameter # #---------------------------------------------------------------------------- sub get_bucket_parameter { my ( $self, $session, $bucket, $parameter ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # See if there's a cached value if ( defined( $self->{db_parameters__}{$userid}{$bucket}{$parameter} ) ) { return $self->{db_parameters__}{$userid}{$bucket}{$parameter}; } # Make sure that the bucket passed in actually exists if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return undef; } # Make sure that the parameter is valid if ( !defined( $self->{db_parameterid__}{$parameter} ) ) { return undef; } # If there is a non-default value for this parameter then return it. $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_bucket_parameter__}, $self->{db_bucketid__}{$userid}{$bucket}{id}, $self->{db_parameterid__}{$parameter} ); # PROFILE BLOCK STOP my $result = $self->{db_get_bucket_parameter__}->fetchrow_arrayref; # If this parameter has not been defined for this specific bucket then # get the default value if ( !defined( $result ) ) { $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_bucket_parameter_default__}, $self->{db_parameterid__}{$parameter} ); # PROFILE BLOCK STOP $result = $self->{db_get_bucket_parameter_default__}->fetchrow_arrayref; } if ( defined( $result ) ) { $self->{db_parameters__}{$userid}{$bucket}{$parameter} = $result->[0]; return $result->[0]; } else { return undef; } } #---------------------------------------------------------------------------- # # set_bucket_parameter # # Sets the value associated with a bucket specific parameter # # $session A valid session key returned by a call to get_session_key # $bucket The name of the bucket # $parameter The name of the parameter # $value The new value # #---------------------------------------------------------------------------- sub set_bucket_parameter { my ( $self, $session, $bucket, $parameter, $value ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Make sure that the bucket passed in actually exists if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return undef; } # Make sure that the parameter is valid if ( !defined( $self->{db_parameterid__}{$parameter} ) ) { return undef; } my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $btid = $self->{db_parameterid__}{$parameter}; # Exactly one row should be affected by this statement $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_set_bucket_parameter__}, $bucketid, $btid, $value ); # PROFILE BLOCK STOP if ( defined( $self->{db_parameters__}{$userid}{$bucket}{$parameter} ) ) { $self->{db_parameters__}{$userid}{$bucket}{$parameter} = $value; } return 1; } #---------------------------------------------------------------------------- # # get_html_colored_message # # Parser a mail message stored in a file and returns HTML representing # the message with coloring of the words # # $session A valid session key returned by a call to get_session_key # $file The file to parse # #---------------------------------------------------------------------------- sub get_html_colored_message { my ( $self, $session, $file ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); $self->{parser__}->{color__} = $session; $self->{parser__}->{color_matrix__} = undef; $self->{parser__}->{color_idmap__} = undef; $self->{parser__}->{color_userid__} = undef; $self->{parser__}->{bayes__} = bless $self; my $result = $self->{parser__}->parse_file( $file, # PROFILE BLOCK START $self->global_config_( 'message_cutoff' ) ); # PROFILE BLOCK STOP $self->{parser__}->{color__} = ''; return $result; } #---------------------------------------------------------------------------- # # fast_get_html_colored_message # # Parser a mail message stored in a file and returns HTML representing # the message with coloring of the words # # $session A valid session key returned by a call to get_session_key # $file The file to colorize # $matrix Reference to the matrix hash from a call to classify # $idmap Reference to the idmap hash from a call to classify # #---------------------------------------------------------------------------- sub fast_get_html_colored_message { my ( $self, $session, $file, $matrix, $idmap ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); $self->{parser__}->{color__} = $session; $self->{parser__}->{color_matrix__} = $matrix; $self->{parser__}->{color_idmap__} = $idmap; $self->{parser__}->{color_userid__} = $userid; $self->{parser__}->{bayes__} = bless $self; my $result = $self->{parser__}->parse_file( $file, # PROFILE BLOCK START $self->global_config_( 'message_cutoff' ) ); # PROFILE BLOCK STOP $self->{parser__}->{color__} = ''; return $result; } #---------------------------------------------------------------------------- # # create_bucket # # Creates a new bucket, returns 1 if the creation succeeded # # $session A valid session key returned by a call to get_session_key # $bucket Name for the new bucket # #---------------------------------------------------------------------------- sub create_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( $self->is_bucket( $session, $bucket ) || # PROFILE BLOCK START $self->is_pseudo_bucket( $session, $bucket ) ) { # PROFILE BLOCK STOP return 0; } return 0 if ( $bucket =~ /[^[:lower:]\-_0-9]/ ); $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'insert into buckets ( name, pseudo, userid ) values ( ?, 0, ? );', $bucket, $userid ); # PROFILE BLOCK STOP $self->db_update_cache__( $session, $bucket ); return 1; } #---------------------------------------------------------------------------- # # delete_bucket # # Deletes a bucket, returns 1 if the delete succeeded # # $session A valid session key returned by a call to get_session_key # $bucket Name of the bucket to delete # #---------------------------------------------------------------------------- sub delete_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Make sure that the bucket passed in actually exists if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'delete from buckets where buckets.userid = ? and buckets.name = ? and buckets.pseudo = 0;', $userid, $bucket ); # PROFILE BLOCK STOP $self->db_update_cache__( $session, undef, $bucket ); $self->{history__}->force_requery(); return 1; } #---------------------------------------------------------------------------- # # rename_bucket # # Renames a bucket, returns 1 if the rename succeeded # # $session A valid session key returned by a call to get_session_key # $old_bucket The old name of the bucket # $new_bucket The new name of the bucket # #---------------------------------------------------------------------------- sub rename_bucket { my ( $self, $session, $old_bucket, $new_bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Make sure that the bucket passed in actually exists if ( !defined( $self->{db_bucketid__}{$userid}{$old_bucket} ) ) { $self->log_( 0, "Bad bucket name $old_bucket to rename_bucket" ); return 0; } if ( defined( $self->{db_bucketid__}{$userid}{$new_bucket} ) ) { $self->log_( 0, "Bucket named $new_bucket already exists" ); return 0; } return 0 if ( $new_bucket =~ /[^[:lower:]\-_0-9]/ ); my $id = $self->{db_bucketid__}{$userid}{$old_bucket}{id}; $self->log_( 1, "Rename bucket $old_bucket to $new_bucket" ); my $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'update buckets set name = ? where id = ?;', $new_bucket, $id ); # PROFILE BLOCK STOP if ( !defined( $result ) || ( $result == -1 ) ) { return 0; } else { $self->db_update_cache__( $session, $new_bucket, $old_bucket ); $self->{history__}->force_requery(); return 1; } } #---------------------------------------------------------------------------- # # add_messages_to_bucket # # Parses mail messages and updates the statistics in the specified bucket # # $session A valid session key returned by a call to get_session_key # $bucket Name of the bucket to be updated # @files List of file names to parse # #---------------------------------------------------------------------------- sub add_messages_to_bucket { my ( $self, $session, $bucket, @files ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } # This is done to clear out the word list because in the loop # below we are going to not reset the word list on each parse $self->{parser__}->start_parse(); $self->{parser__}->stop_parse(); foreach my $file (@files) { $self->{parser__}->parse_file( $file, # PROFILE BLOCK START $self->global_config_( 'message_cutoff' ), 0 ); # PROFILE BLOCK STOP (Do not reset word list) } $self->add_words_to_bucket__( $session, $bucket, 1 ); $self->db_update_cache__( $session, $bucket ); return 1; } #---------------------------------------------------------------------------- # # add_message_to_bucket # # Parses a mail message and updates the statistics in the specified bucket # # $session A valid session key returned by a call to get_session_key # $bucket Name of the bucket to be updated # $file Name of file containing mail message to parse # #---------------------------------------------------------------------------- sub add_message_to_bucket { my ( $self, $session, $bucket, $file ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } return $self->add_messages_to_bucket( $session, $bucket, $file ); } #---------------------------------------------------------------------------- # # remove_message_from_bucket # # Parses a mail message and updates the statistics in the specified bucket # # $session A valid session key returned by a call to get_session_key # $bucket Name of the bucket to be updated # $file Name of file containing mail message to parse # #---------------------------------------------------------------------------- sub remove_message_from_bucket { my ( $self, $session, $bucket, $file ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } $self->{parser__}->parse_file( $file, # PROFILE BLOCK START $self->global_config_( 'message_cutoff' ) ); # PROFILE BLOCK STOP $self->add_words_to_bucket__( $session, $bucket, -1 ); $self->db_update_cache__( $session, $bucket ); return 1; } #---------------------------------------------------------------------------- # # get_buckets_with_magnets # # Returns the names of the buckets for which magnets are defined # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_buckets_with_magnets { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @result; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START $self->{db_get_buckets_with_magnets__}, $userid ); # PROFILE BLOCK STOP while ( my $row = $self->{db_get_buckets_with_magnets__}->fetchrow_arrayref ) { push @result, ($row->[0]); } return @result; } #---------------------------------------------------------------------------- # # get_magnet_types_in_bucket # # Returns the types of the magnets in a specific bucket # # $session A valid session key returned by a call to get_session_key # $bucket The bucket to search for magnets # #---------------------------------------------------------------------------- sub get_magnet_types_in_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @result; if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return undef; } my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $h = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnet_types.mtype from magnet_types, magnets, buckets where magnet_types.id = magnets.mtid and magnets.bucketid = buckets.id and buckets.id = ? group by magnet_types.mtype order by magnet_types.mtype;', $bucketid ); # PROFILE BLOCK STOP while ( my $row = $h->fetchrow_arrayref ) { push @result, ($row->[0]); } $h->finish; return @result; } #---------------------------------------------------------------------------- # # clear_bucket # # Removes all words from a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The bucket to clear # #---------------------------------------------------------------------------- sub clear_bucket { my ( $self, $session, $bucket ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return undef; } my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'delete from matrix where matrix.bucketid = ?;', $bucketid ); # PROFILE BLOCK STOP $self->db_update_cache__( $session, $bucket ); return 1; } #---------------------------------------------------------------------------- # # clear_magnets # # Removes every magnet currently defined # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub clear_magnets { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); for my $bucket (keys %{$self->{db_bucketid__}{$userid}}) { my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'delete from magnets where magnets.bucketid = ?;', $bucketid ); # PROFILE BLOCK STOP # Change status of the magnetized message in this bucket $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'update history set magnetid = 0 where bucketid = ? and userid = ?;', $bucketid, $userid ); # PROFILE BLOCK STOP } return 1; } #---------------------------------------------------------------------------- # # get_magnets # # Returns the magnets of a certain type in a bucket # # $session A valid session key returned by a call to get_session_key # $bucket The bucket to search for magnets # $type The magnet type (e.g. from, to or subject) # #---------------------------------------------------------------------------- sub get_magnets { my ( $self, $session, $bucket, $type ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my @result; if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } return 0 if ( !defined( $type ) ); my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $h = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnets.val from magnets, magnet_types where magnets.bucketid = ? and magnets.id != 0 and magnet_types.id = magnets.mtid and magnet_types.mtype = ? order by magnets.val;', $bucketid, $type ); # PROFILE BLOCK STOP while ( my $row = $h->fetchrow_arrayref ) { push @result, ($row->[0]); } $h->finish; return @result; } #---------------------------------------------------------------------------- # # create_magnet # # Make a new magnet # # $session A valid session key returned by a call to get_session_key # $bucket The bucket the magnet belongs in # $type The magnet type (e.g. from, to or subject) # $text The text of the magnet # #---------------------------------------------------------------------------- sub create_magnet { my ( $self, $session, $bucket, $type, $text ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnet_types.id from magnet_types where magnet_types.mtype = ?;', $type )->fetchrow_arrayref; # PROFILE BLOCK STOP my $mtid = $result->[0]; return 0 if ( !defined( $mtid ) ); $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'insert into magnets ( bucketid, mtid, val ) values ( ?, ?, ? );', $bucketid, $mtid, $text ); # PROFILE BLOCK STOP return 1; } #---------------------------------------------------------------------------- # # get_magnet_types # # Get a hash mapping magnet types (e.g. from) to magnet names (e.g. From); # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_magnet_types { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my %result; my $h = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnet_types.mtype, magnet_types.header from magnet_types order by mtype;' ); # PROFILE BLOCK STOP while ( my $row = $h->fetchrow_arrayref ) { $result{$row->[0]} = $row->[1]; } $h->finish; return %result; } #---------------------------------------------------------------------------- # # delete_magnet # # Remove a magnet # # $session A valid session key returned by a call to get_session_key # $bucket The bucket the magnet belongs in # $type The magnet type (e.g. from, to or subject) # $text The text of the magnet # #---------------------------------------------------------------------------- sub delete_magnet { my ( $self, $session, $bucket, $type, $text ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); if ( !defined( $self->{db_bucketid__}{$userid}{$bucket} ) ) { return 0; } my $bucketid = $self->{db_bucketid__}{$userid}{$bucket}{id}; my $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select magnets.id from magnets, magnet_types where magnets.mtid = magnet_types.id and magnets.bucketid = ? and magnets.val = ? and magnet_types.mtype = ?;', $bucketid, $text, $type )->fetchrow_arrayref; # PROFILE BLOCK STOP return 0 if ( !defined( $result ) ); my $magnetid = $result->[0]; return 0 if ( !defined( $magnetid ) ); $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'delete from magnets where id = ?;', $magnetid ); # PROFILE BLOCK STOP # Change status of the magnetized message by this magnet $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'update history set magnetid = 0 where magnetid = ? and userid = ?;', $magnetid, $userid ); # PROFILE BLOCK STOP $self->{history__}->force_requery(); return 1; } #---------------------------------------------------------------------------- # # get_stopword_list # # Gets the complete list of stop words # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub get_stopword_list { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); return $self->{parser__}->{mangle__}->stopwords(); } #---------------------------------------------------------------------------- # # magnet_count # # Gets the number of magnets that are defined # # $session A valid session key returned by a call to get_session_key # #---------------------------------------------------------------------------- sub magnet_count { my ( $self, $session ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); my $result = $self->validate_sql_prepare_and_execute( # PROFILE BLOCK START 'select count(*) from magnets, buckets where buckets.userid = ? and magnets.id != 0 and magnets.bucketid = buckets.id;', $userid )->fetchrow_arrayref; # PROFILE BLOCK STOP if ( defined( $result ) ) { return $result->[0]; } else { return 0; } } #---------------------------------------------------------------------------- # # add_stopword, remove_stopword # # Adds or removes a stop word # # $session A valid session key returned by a call to get_session_key # $stopword The word to add or remove # # Return 0 for a bad stop word, and 1 otherwise # #---------------------------------------------------------------------------- sub add_stopword { my ( $self, $session, $stopword ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Pass language parameter to add_stopword() return $self->{parser__}->{mangle__}->add_stopword( # PROFILE BLOCK START $stopword, $self->module_config_( 'html', 'language' ) ); # PROFILE BLOCK STOP } sub remove_stopword { my ( $self, $session, $stopword ) = @_; my $userid = $self->valid_session_key__( $session ); return undef if ( !defined( $userid ) ); # Pass language parameter to remove_stopword() return $self->{parser__}->{mangle__}->remove_stopword( # PROFILE BLOCK START $stopword, $self->module_config_( 'html', 'language' ) ); # PROFILE BLOCK STOP } #---------------------------------------------------------------------------- # # db_quote # # Quote a string for use in a sql statement. Before calling DBI::quote on the # string the string is also checked for any null-bytes. # # $string The string that should be quoted. # # returns the quoted string without any possible null-bytes #---------------------------------------------------------------------------- sub db_quote { my $self = shift; my $string = shift; my $backup = $string; if ( $string =~ s/\x00//g ) { my ( $package, $file, $line ) = caller; $self->log_( 0, "Found null-byte in string '$backup'. Called from package '$package' ($file), line $line." ); } return $self->{db__}->quote( $string ); } #---------------------------------------------------------------------------- # # validate_sql_prepare_and_execute # # This method will prepare sql statements and execute them. # The statement itself and any binding parameters are also # tested for possible null-characters (\x00). # If you pass in a handle to a prepared statement, the statement # will be executed and possible binding-parameters are checked. # # $statement The sql statement to prepare or the prepared statement handle # @args The (optional) list of binding parameters # # Returns the result of prepare() #---------------------------------------------------------------------------- sub validate_sql_prepare_and_execute { my $self = shift; my $sql_or_sth = shift; my @args = @_; my $dbh = $self->db(); my $sth = undef; # Is this a statement-handle or a sql string? if ( (ref $sql_or_sth) =~ m/^DBI::/ ) { $sth = $sql_or_sth; } else { my $sql = $sql_or_sth; $sql = $self->check_for_nullbytes( $sql ); $sth = $dbh->prepare( $sql ); } my $execute_result = undef; # Any binding-params? if ( @args ) { foreach my $arg ( @args ) { $arg = $self->check_for_nullbytes( $arg ); } $execute_result = $sth->execute( @args ); } else { $execute_result = $sth->execute(); } unless ( $execute_result ) { my ( $package, $file, $line ) = caller; $self->log_( 0, "DBI::execute failed. Called from package '$package' ($file), line $line." ); } return $sth; } #---------------------------------------------------------------------------- # # check_for_nullbytes # # Will check a passed-in string for possible null-bytes and log and error # message in case a null-byte is found. # # Will return the string with any null-bytes removed. #---------------------------------------------------------------------------- sub check_for_nullbytes { my $self = shift; my $string = shift; if ( defined $string ) { my $backup = $string; if ( my $count = ( $string =~ s/\x00//g ) ) { my ( $package, $file, $line ) = caller( 1 ); $self->log_( 0, "Found $count null-character(s) in string '$backup'. Called from package '$package' ($file), line $line." ); } } return $string; } #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # _____ _____ _____ _______ _____ _______ _______ _____ _____ #|_____] | | |_____] |______ | | |______ |_____| |_____] | #| |_____| | | __|__ |_____ |______ | | | __|__ # #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # GETTERS/SETTERS sub wordscores { my ( $self, $value ) = @_; $self->{wordscores__} = $value if (defined $value); return $self->{wordscores__}; } sub wmformat { my ( $self, $value ) = @_; $self->{wmformat__} = $value if (defined $value); return $self->{wmformat__}; } sub db { my ( $self ) = @_; return $self->{db__}; } sub history { my ( $self, $history ) = @_; $self->{history__} = $history; } 1; popfile-1.1.3+dfsg/Classifier/MailParse.pm0000664000175000017500000033431111710356074017655 0ustar danieldanielpackage Classifier::MailParse; # ---------------------------------------------------------------------------- # # MailParse.pm --- Parse a mail message or messages into words # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use warnings; use locale; use MIME::Base64; use MIME::QuotedPrint; use HTML::Tagset; # Korean characters definition my $ksc5601_sym = '(?:[\xA1-\xAC][\xA1-\xFE])'; my $ksc5601_han = '(?:[\xB0-\xC8][\xA1-\xFE])'; my $ksc5601_hanja = '(?:[\xCA-\xFD][\xA1-\xFE])'; my $ksc5601 = "(?:$ksc5601_sym|$ksc5601_han|$ksc5601_hanja)"; my $eksc = "(?:$ksc5601|[\x81-\xC6][\x41-\xFE])"; #extended ksc # These are used for Japanese support my %encoding_candidates = ( # PROFILE BLOCK START 'Nihongo' => [ 'cp932', 'euc-jp', '7bit-jis' ] ); # PROFILE BLOCK STOP my $ascii = '[\x00-\x7F]'; # ASCII chars my $two_bytes_euc_jp = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2bytes EUC-JP chars my $three_bytes_euc_jp = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3bytes EUC-JP chars my $euc_jp = "(?:$ascii|$two_bytes_euc_jp|$three_bytes_euc_jp)"; # EUC-JP chars # Symbols in EUC-JP chars which cannot be considered a part of words my $symbol_row1_euc_jp = '(?:[\xA1][\xA1-\xBB\xBD-\xFE])'; my $symbol_row2_euc_jp = '(?:[\xA2][\xA1-\xFE])'; my $symbol_row8_euc_jp = '(?:[\xA8][\xA1-\xFE])'; my $symbol_euc_jp = "(?:$symbol_row1_euc_jp|$symbol_row2_euc_jp|$symbol_row8_euc_jp)"; # Cho-on kigou(symbol in Japanese), a special symbol which can appear # in middle of words my $cho_on_symbol = '(?:\xA1\xBC)'; # Non-symbol EUC-JP chars my $non_symbol_two_bytes_euc_jp = '(?:[\x8E\xA3-\xA7\xB0-\xFE][\xA1-\xFE])'; my $non_symbol_euc_jp = "(?:$non_symbol_two_bytes_euc_jp|$three_bytes_euc_jp|$cho_on_symbol)"; # Constants for the internal wakachigaki parser. # Kind of EUC-JP chars my $euc_jp_symbol = '[\xA1\xA2\xA6-\xA8\xAD\xF9-\xFC][\xA1-\xFE]'; # The symbols make a word of one character. my $euc_jp_alphanum = '(?:\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA])+'; # One or more alphabets and numbers my $euc_jp_hiragana = '(?:(?:\xA4[\xA1-\xF3])+(?:\xA1[\xAB\xAC\xB5\xB6\xBC])*)+'; # One or more Hiragana characters my $euc_jp_katakana = '(?:(?:\xA5[\xA1-\xF6])+(?:\xA1[\xA6\xBC\xB3\xB4])*)+'; # One or more Katakana characters my $euc_jp_hkatakana = '(?:\x8E[\xA6-\xDF])+'; # One or more Half-width Katakana characters my $euc_jp_kanji = '[\xB0-\xF4][\xA1-\xFE](?:[\xB0-\xF4][\xA1-\xFE]|\xA1\xB9)?'; # One or two Kanji characters my $euc_jp_word = '(' . # PROFILE BLOCK START $euc_jp_alphanum . '|' . $euc_jp_hiragana . '|' . $euc_jp_katakana . '|' . $euc_jp_hkatakana . '|' . $euc_jp_kanji . '|' . $euc_jp_symbol . '|' . $ascii . '+|' . $three_bytes_euc_jp . ')'; # PROFILE BLOCK STOP # HTML entity mapping to character codes, this maps things like & # to their corresponding character code my %entityhash = ( # PROFILE BLOCK START 'aacute' => 225, 'Aacute' => 193, 'Acirc' => 194, 'acirc' => 226, 'acute' => 180, 'AElig' => 198, 'aelig' => 230, 'Agrave' => 192, 'agrave' => 224, 'amp' => 38, 'Aring' => 197, 'aring' => 229, 'atilde' => 227, 'Atilde' => 195, 'Auml' => 196, 'auml' => 228, 'brvbar' => 166, 'ccedil' => 231, 'Ccedil' => 199, 'cedil' => 184, 'cent' => 162, 'copy' => 169, 'curren' => 164, 'deg' => 176, 'divide' => 247, 'Eacute' => 201, 'eacute' => 233, 'ecirc' => 234, 'Ecirc' => 202, 'Egrave' => 200, 'egrave' => 232, 'ETH' => 208, 'eth' => 240, 'Euml' => 203, 'euml' => 235, 'frac12' => 189, 'frac14' => 188, 'frac34' => 190, 'iacute' => 237, 'Iacute' => 205, 'icirc' => 238, 'Icirc' => 206, 'iexcl' => 161, 'igrave' => 236, 'Igrave' => 204, 'iquest' => 191, 'iuml' => 239, 'Iuml' => 207, 'laquo' => 171, 'macr' => 175, 'micro' => 181, 'middot' => 183, 'nbsp' => 160, 'not' => 172, 'ntilde' => 241, 'Ntilde' => 209, 'oacute' => 243, 'Oacute' => 211, 'Ocirc' => 212, 'ocirc' => 244, 'Ograve' => 210, 'ograve' => 242, 'ordf' => 170, 'ordm' => 186, 'oslash' => 248, 'Oslash' => 216, 'Otilde' => 213, 'otilde' => 245, 'Ouml' => 214, 'ouml' => 246, 'para' => 182, 'plusmn' => 177, 'pound' => 163, 'raquo' => 187, 'reg' => 174, 'sect' => 167, 'shy' => 173, 'sup1' => 185, 'sup2' => 178, 'sup3' => 179, 'szlig' => 223, 'thorn' => 254, 'THORN' => 222, 'times' => 215, 'Uacute' => 218, 'uacute' => 250, 'ucirc' => 251, 'Ucirc' => 219, 'ugrave' => 249, 'Ugrave' => 217, 'uml' => 168, 'Uuml' => 220, 'uuml' => 252, 'Yacute' => 221, 'yacute' => 253, 'yen' => 165, 'yuml' => 255 ); # PROFILE BLOCK STOP # All known HTML tags divided into two groups: tags that generate # whitespace as in 'foo

bar' and tags that don't such as # 'foobar'. The first case shouldn't count as an empty pair # because it breaks the line. The second case doesn't have any visual # impact and it treated as 'foobar' with an empty pair. my $spacing_tags = "address|applet|area|base|basefont" . # PROFILE BLOCK START "|bdo|bgsound|blockquote|body|br|button|caption" . "|center|col|colgroup|dd|dir|div|dl|dt|embed" . "|fieldset|form|frame|frameset|h1|h2|h3|h4|h5|h6" . "|head|hr|html|iframe|ilayer|input|isindex|label" . "|legend|li|link|listing|map|menu|meta|multicol" . "|nobr|noembed|noframes|nolayer|noscript|object" . "|ol|optgroup|option|p|param|plaintext|pre|script" . "|select|spacer|style|table|tbody|td|textarea" . "|tfoot|th|thead|title|tr|ul|wbr|xmp"; # PROFILE BLOCK STOP my $non_spacing_tags = "a|abbr|acronym|b|big|blink" . # PROFILE BLOCK START "|cite|code|del|dfn|em|font|i|img|ins|kbd|q|s" . "|samp|small|span|strike|strong|sub|sup|tt|u|var"; # PROFILE BLOCK STOP my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self; # Hash of word frequences $self->{words__} = {}; # Total word cout $self->{msg_total__} = 0; # Internal use for keeping track of a line without touching it $self->{ut__} = ''; # Specifies the parse mode, '' means no color output, if non-zero # then color output using a specific session key stored here $self->{color__} = ''; $self->{color_matrix__} = undef; $self->{color_idmap__} = undef; $self->{color_userid__} = undef; # This will store the from, to, cc and subject from the last parse $self->{from__} = ''; $self->{to__} = ''; $self->{cc__} = ''; $self->{subject__} = ''; # This is used to store the words found in the from, to, and subject # lines for use in creating new magnets, it is a list of pairs mapping # a magnet type to a magnet string, e.g. from => popfile@jgc.org $self->{quickmagnets__} = {}; # store the tag that set the foreground/background color so the # color can be unset when the tag closes $self->{cssfontcolortag__} = ''; $self->{cssbackcolortag__} = ''; # This is the distance betwee the back color and the font color # as computed using compute_rgb_distance $self->{htmlcolordistance__} = 0; # This is a mapping between HTML color names and HTML hexadecimal # color values used by the map_color value to get canonical color # values $self->{color_map__} = { # PROFILE BLOCK START 'aliceblue', 'f0f8ff', 'antiquewhite', 'faebd7', 'aqua', '00ffff', 'aquamarine', '7fffd4', 'azure', 'f0ffff', 'beige', 'f5f5dc', 'bisque', 'ffe4c4', 'black', '000000', 'blanchedalmond', 'ffebcd', 'blue', '0000ff', 'blueviolet', '8a2be2', 'brown', 'a52a2a', 'burlywood', 'deb887', 'cadetblue', '5f9ea0', 'chartreuse', '7fff00', 'chocolate', 'd2691e', 'coral', 'ff7f50', 'cornflowerblue', '6495ed', 'cornsilk', 'fff8dc', 'crimson', 'dc143c', 'cyan', '00ffff', 'darkblue', '00008b', 'darkcyan', '008b8b', 'darkgoldenrod', 'b8860b', 'darkgray', 'a9a9a9', 'darkgreen', '006400', 'darkkhaki', 'bdb76b', 'darkmagenta', '8b008b', 'darkolivegreen', '556b2f', 'darkorange', 'ff8c00', 'darkorchid', '9932cc', 'darkred', '8b0000', 'darksalmon', 'e9967a', 'darkseagreen', '8fbc8f', 'darkslateblue', '483d8b', 'darkturquoise', '00ced1', 'darkviolet', '9400d3', 'deeppink', 'ff1493', 'deepskyblue', '00bfff', 'deepskyblue', '2f4f4f', 'dimgray', '696969', 'dodgerblue', '1e90ff', 'firebrick', 'b22222', 'floralwhite', 'fffaf0', 'forestgreen', '228b22', 'fuchsia', 'ff00ff', 'gainsboro', 'dcdcdc', 'ghostwhite', 'f8f8ff', 'gold', 'ffd700', 'goldenrod', 'daa520', 'gray', '808080', 'green', '008000', 'greenyellow', 'adff2f', 'honeydew', 'f0fff0', 'hotpink', 'ff69b4', 'indianred', 'cd5c5c', 'indigo', '4b0082', 'ivory', 'fffff0', 'khaki', 'f0e68c', 'lavender', 'e6e6fa', 'lavenderblush', 'fff0f5', 'lawngreen', '7cfc00', 'lemonchiffon', 'fffacd', 'lightblue', 'add8e6', 'lightcoral', 'f08080', 'lightcyan', 'e0ffff', 'lightgoldenrodyellow', 'fafad2', 'lightgreen', '90ee90', 'lightgrey', 'd3d3d3', 'lightpink', 'ffb6c1', 'lightsalmon', 'ffa07a', 'lightseagreen', '20b2aa', 'lightskyblue', '87cefa', 'lightslategray', '778899', 'lightsteelblue', 'b0c4de', 'lightyellow', 'ffffe0', 'lime', '00ff00', 'limegreen', '32cd32', 'linen', 'faf0e6', 'magenta', 'ff00ff', 'maroon', '800000', 'mediumaquamarine', '66cdaa', 'mediumblue', '0000cd', 'mediumorchid', 'ba55d3', 'mediumpurple', '9370db', 'mediumseagreen', '3cb371', 'mediumslateblue', '7b68ee', 'mediumspringgreen', '00fa9a', 'mediumturquoise', '48d1cc', 'mediumvioletred', 'c71585', 'midnightblue', '191970', 'mintcream', 'f5fffa', 'mistyrose', 'ffe4e1', 'moccasin', 'ffe4b5', 'navajowhite', 'ffdead', 'navy', '000080', 'oldlace', 'fdf5e6', 'olive', '808000', 'olivedrab', '6b8e23', 'orange', 'ffa500', 'orangered', 'ff4500', 'orchid', 'da70d6', 'palegoldenrod', 'eee8aa', 'palegreen', '98fb98', 'paleturquoise', 'afeeee', 'palevioletred', 'db7093', 'papayawhip', 'ffefd5', 'peachpuff', 'ffdab9', 'peru', 'cd853f', 'pink', 'ffc0cb', 'plum', 'dda0dd', 'powderblue', 'b0e0e6', 'purple', '800080', 'red', 'ff0000', 'rosybrown', 'bc8f8f', 'royalblue', '4169e1', 'saddlebrown', '8b4513', 'salmon', 'fa8072', 'sandybrown', 'f4a460', 'seagreen', '2e8b57', 'seashell', 'fff5ee', 'sienna', 'a0522d', 'silver', 'c0c0c0', 'skyblue', '87ceeb', 'slateblue', '6a5acd', 'slategray', '708090', 'snow', 'fffafa', 'springgreen', '00ff7f', 'steelblue', '4682b4', 'tan', 'd2b48c', 'teal', '008080', 'thistle', 'd8bfd8', 'tomato', 'ff6347', 'turquoise', '40e0d0', 'violet', 'ee82ee', 'wheat', 'f5deb3', 'white', 'ffffff', 'whitesmoke', 'f5f5f5', 'yellow', 'ffff00', 'yellowgreen', '9acd32' }; # PROFILE BLOCK STOP # These store the current HTML background color and font color to # detect "invisible ink" used by spammers my $result = bless $self, $type; $self->{htmlbackcolor__} = $self->map_color( 'white' ); $self->{htmlbodycolor__} = $self->map_color( 'white' ); $self->{htmlfontcolor__} = $self->map_color( 'black' ); $self->{content_type__} = ''; $self->{base64__} = ''; $self->{in_html_tag__} = 0; $self->{html_tag__} = ''; $self->{html_arg__} = ''; $self->{in_headers__} = 0; # This is used for switching on/off language specific functionality $self->{lang__} = ''; $self->{first20__} = ''; # For support Quoted Printable, save encoded text in multiple lines $self->{prev__} = ''; # Object for the Nihongo (Japanese) parser. $self->{nihongo_parser__} = undef; return $result; } # ---------------------------------------------------------------------------- # # get_color__ # # Gets the color for the passed in word # # $word The word to check # # ---------------------------------------------------------------------------- sub get_color__ { my ( $self, $word ) = @_; if ( !defined( $self->{color_matrix__} ) ) { return $self->{bayes__}->get_color( $self->{color__}, $word ); } else { my $id; for my $i ( keys %{ $self->{color_idmap__} } ) { if ( $word eq $self->{color_idmap__}{$i} ) { $id = $i; last; } } if ( defined( $id ) ) { my @buckets = $self->{bayes__}->get_buckets( $self->{color__} ); return $self->{bayes__}->get_bucket_color( # PROFILE BLOCK START $self->{color__}, $self->{bayes__}->get_top_bucket__( $self->{color_userid__}, $id, $self->{color_matrix__}, \@buckets ) ); # PROFILE BLOCK STOP } else { return 'black'; } } } # ---------------------------------------------------------------------------- # # compute_rgb_distance # # Given two RGB colors compute the distance between them by # considering them as points in 3 dimensions and calculating the # distance between them (or equivalently the length of a vector # between them) # # $left One color # $right The other color # # ---------------------------------------------------------------------------- sub compute_rgb_distance { my ( $self, $left, $right ) = @_; # TODO: store front/back colors in a RGB hash/array # converting to a hh hh hh format and back # is a waste as is repeatedly decoding # from hh hh hh format # Figure out where the left color is and then subtract the right # color (point from it) to get the vector $left =~ /^(..)(..)(..)$/; my ( $rl, $gl, $bl ) = ( hex( $1 ), hex( $2 ), hex( $3 ) ); $right =~ /^(..)(..)(..)$/; my ( $r, $g, $b ) = ( $rl - hex( $1 ), $gl - hex( $2 ), $bl - hex( $3 ) ); # Now apply Pythagoras in 3D to get the distance between them, we # return the int because we don't need decimal level accuracy my $distance = int( sqrt( $r*$r + $g*$g + $b*$b ) ); print "rgb distance: $left -> $right = $distance" if $self->{debug__}; return $distance; } # ---------------------------------------------------------------------------- # # compute_html_color_distance # # Calls compute_rgb_distance to set up htmlcolordistance__ from the # current HTML back and font colors # # ---------------------------------------------------------------------------- sub compute_html_color_distance { my ( $self ) = @_; # TODO: store front/back colors in a RGB hash/array # converting to a hh hh hh format and back # is a waste as is repeatedly decoding # from hh hh hh format if ( $self->{htmlfontcolor__} ne '' && $self->{htmlbackcolor__} ne '' ) { $self->{htmlcolordistance__} = $self->compute_rgb_distance( # PROFILE BLOCK START $self->{htmlfontcolor__}, $self->{htmlbackcolor__} ); # PROFILE BLOCK STOP } } # ---------------------------------------------------------------------------- # # map_color # # Convert an HTML color value into its canonical lower case # hexadecimal form with no # # # $color A color value found in a tag # # ---------------------------------------------------------------------------- sub map_color { my ( $self, $color ) = @_; # The canonical form is lowercase hexadecimal, so start by # lowercasing and stripping any initial # $color = lc( $color ); # Map color names to hexadecimal values if ( defined( $self->{color_map__}{$color} ) ) { return $self->{color_map__}{$color}; } else { # Do this after checking the color map, as there is no "#blue" color # TODO: The #, however, is optional in IE.. Do we pseudo-word this? $color =~ s/^#//; my $old_color = $color; # Due to a bug/feature in Microsoft Internet Explorer it's # possible to use invalid hexadecimal colors where the number # 0 is replaced by any other character and if the hex has an # uneven multiple of 3 number of characters it is padded on # the right with 0s and if the hex is too long, it is divided # into even triplets with the leftmost characters in the # triplets being significant. Short (1-char) triplets are # left-padded with 0's # We go one higher than the quotient if the length isn't an # even multiple of 3 my $quotient = int ( ( length( $color ) + 2 ) / 3 ); # right-pad entire value to get past the next full multiple of # the quotient ("abc abc abc" needs at least one more # character to make three even triplets) $color .= "00" . "0" x $quotient; # even length RGB triplets my ( $r, $g, $b ) = # PROFILE BLOCK START ( $color =~ /(.{$quotient})(.{$quotient})(.{$quotient})/ ); # PROFILE BLOCK STOP print "$r $g $b\n" if $self->{debug__}; # left-trim very long triplets to 4 bytes $r =~ s/.*(.{8})$/$1/; $g =~ s/.*(.{8})$/$1/; $b =~ s/.*(.{8})$/$1/; # right-trim long triplets to get the first two bytes $r =~ s/(..).*/$1/; $g =~ s/(..).*/$1/; $b =~ s/(..).*/$1/; # left-pad short triplets (eg FFF -> 0F0F0F) $r = '0' . $r if ( length( $r ) == 1 ); $g = '0' . $g if ( length( $g ) == 1 ); $b = '0' . $b if ( length( $b ) == 1 ); $color = "$r$g$b"; # here is our real color value # Any non-hex values remaining get 0'd out $color =~ s/[^0-9a-f]/0/g; if ( $self->{debug__} ) { # PROFILE BLOCK START print "hex color $color\n"; print "flex-hex detected\n" if ( $color ne $old_color ); } # PROFILE BLOCK STOP # Add pseudo-word anytime flex hex detected if ( $color ne $old_color ) { $self->update_pseudoword( 'trick:flexhex', $old_color, 0, '' ); } return $color; } } # ---------------------------------------------------------------------------- # # increment_word # # Updates the word frequency for a word without performing any # coloring or transformation on the word # # $word The word # # ---------------------------------------------------------------------------- sub increment_word { my ( $self, $word ) = @_; $self->{words__}{$word} += 1; $self->{msg_total__} += 1; print "--- $word ($self->{words__}{$word})\n" if $self->{debug__}; } # ---------------------------------------------------------------------------- # # update_pseudoword # # Updates the word frequency for a pseudoword, note that this differs # from update_word because it does no word mangling # # $prefix The pseudoword prefix (e.g. header) # $word The pseudoword (e.g. Mime-Version) # $encoded Whether this was found inside encoded text # $literal The literal text that generated this pseudoword # # Returns 0 if the pseudoword was filtered out by a stopword # # ---------------------------------------------------------------------------- sub update_pseudoword { my ( $self, $prefix, $word, $encoded, $literal ) = @_; my $mword = $self->{mangle__}->mangle( "$prefix:$word", 1 ); if ( $mword ne '' ) { if ( $self->{color__} ne '' ) { if ( $encoded == 1 ) { $literal =~ s//>/g; my $color = $self->get_color__( $mword ); my $to = "$literal"; $self->{ut__} .= $to . ' '; } } $self->increment_word( $mword ); return 1; } return 0; } # ---------------------------------------------------------------------------- # # update_word # # Updates the word frequency for a word # # $word The word that is being updated # $encoded 1 if the line was found in encoded text (base64) # $before The character that appeared before the word in the original # line # $after The character that appeared after the word in the original line # $prefix A string to prefix any words with in the corpus, used for the # special # identification of values found in for example the subject line # # ---------------------------------------------------------------------------- sub update_word { my ( $self, $word, $encoded, $before, $after, $prefix ) = @_; my $mword = $self->{mangle__}->mangle( $word ); if ( $mword ne '' ) { $mword = $prefix . ':' . $mword if ( $prefix ne '' ); if ( $prefix =~ /(from|to|cc|subject)/i ) { push @{ $self->{quickmagnets__}{$prefix} }, $word; } if ( $self->{color__} ne '' ) { my $color = $self->get_color__( $mword ); if ( $encoded == 0 ) { $after = '&' if ( $after eq '>' ); if ( !( $self->{ut__} =~ # PROFILE BLOCK START s/($before)\Q$word\E($after) /$1$word<\/font><\/b>$2/x ) ) { # PROFILE BLOCK STOP print "Could not find $word for colorization\n" if $self->{debug__}; } } else { $self->{ut__} .= "$word<\/font> "; } } $self->increment_word( $mword ); } } # ---------------------------------------------------------------------------- # # add_line # # Parses a single line of text and updates the word frequencies # # $bigline The line to split into words and add to the word counts # $encoded 1 if the line was found in encoded text (base64) # $prefix A string to prefix any words with in the corpus, used for the # special identification of values found in for example the # subject line # # ---------------------------------------------------------------------------- sub add_line { my ( $self, $bigline, $encoded, $prefix ) = @_; my $p = 0; return if ( !defined( $bigline ) ); print "add_line: [$bigline]\n" if $self->{debug__}; # If the line is really long then split at every 1k and feed it to # the parser below # Check the HTML back and font colors to ensure that we are not # about to add words that are hidden inside invisible ink if ( $self->{htmlfontcolor__} ne $self->{htmlbackcolor__} ) { # If we are adding a line and the colors are different then we # will add a count for the color difference to make sure that # we catch camouflage attacks using similar colors, if the # color similarity is less than 100. I chose 100 somewhat # arbitrarily but classic black text on white background has a # distance of 441, red/blue or green on white has distance # 255. 100 seems like a reasonable upper bound for tracking # evil spammer tricks with similar colors if ( $self->{htmlcolordistance__} < 100 ) { $self->update_pseudoword( # PROFILE BLOCK START 'html', "colordistance$self->{htmlcolordistance__}", $encoded, '' ); # PROFILE BLOCK STOP } while ( $p < length( $bigline ) ) { my $line = substr( $bigline, $p, 1024 ); # mangle up html character entities # these are just the low ISO-Latin1 entities # see: http://www.w3.org/TR/REC-html32#latin1 # TODO: find a way to make this (and other similar stuff) highlight # without using the encoded content printer or modifying $self->{ut__} while ( $line =~ m/(&(\w{3,6});)/g ) { my $from = $1; my $to = $entityhash{$2}; if ( defined( $to ) ) { # HTML entities confilict with DBCS and EUC-JP # chars. Replace entities with blanks. if ( $self->{lang__} =~ /^(Korean|Nihongo)$/ ) { $to = ' '; } else { $to = chr( $to ); } $line =~ s/$from/$to/g; $self->{ut__} =~ s/$from/$to/g; print "$from -> $to\n" if $self->{debug__}; } } while ( $line =~ m/(&#([\d]{1,3});)/g ) { # Don't decode odd (nonprintable) characters or < >'s. if ( ( ( $2 < 255 ) && ( $2 > 63 ) ) || # PROFILE BLOCK START ( $2 == 61 ) || ( ( $2 < 60 ) && ( $2 > 31 ) ) ) { # PROFILE BLOCK STOP my $from = $1; my $to = chr( $2 ); if ( defined( $to ) && ( $to ne '' ) ) { $line =~ s/$from/$to/g; $self->{ut__} =~ s/$from/$to/g; print "$from -> $to\n" if $self->{debug__}; $self->update_pseudoword( # PROFILE BLOCK START 'html', 'numericentity', $encoded, $from ); # PROFILE BLOCK STOP } } } # Pull out any email addresses in the line that are marked # with <> and have an @ in them while ( $line =~ s/(mailto:)? # PROFILE BLOCK START ([[:alpha:]0-9\-_\.]+? @ ([[:alpha:]0-9\-_\.]+\.[[:alpha:]0-9\-_]+)) ([\"\&\)\?\:\/ >\&\;]|$)//x ) { # PROFILE BLOCK STOP $self->update_word( $2, $encoded, ( $1 ? $1 : '' ), # PROFILE BLOCK START '[\&\?\:\/ >\&\;]', $prefix ); # PROFILE BLOCK STOP $self->add_url( $3, $encoded, '\@', '[\&\?\:\/]', $prefix ); } # Grab domain names (gTLD) # http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains while ( $line =~ s/(([[:alpha:]0-9\-_]+\.)+) # PROFILE BLOCK START (aero|arpa|asia|biz|cat|com|coop|edu|gov|info| int|jobs|mil|mobi|museum|name|net|org|pro|tel| travel|xxx) ([^[:alpha:]0-9\-_\.]|$)/$4/ix ) { # PROFILE BLOCK STOP $self->add_url( "$1$3", $encoded, '', '', $prefix ); } # Grab country domain names (ccTLD) # http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains while ( $line =~ s/(([[:alpha:]0-9\-_]+\.)+) # PROFILE BLOCK START (a[cdefgilmnoqrstuwxz]| b[abdefghijmnorstvwyz]| c[acdfghiklmnorsuvxyz]| d[ejkmoz]| e[cegrstu]| f[ijkmor]| g[abdefghilmnpqrstuwy]| h[kmnrtu]| i[delmnoqrst]| j[emop]| k[eghimnprwyz]| l[abcikrstuvy]| m[acdeghklmnopqrstuvwxyz]| n[acefgilopruz]| om| p[aefghklmnrstwy]| qa| r[eosuw]| s[abcdeghijklmnortuvyz]| t[cdfghjklmnoprtvwz]| u[agksyz]| v[aceginu]| w[fs]| y[et]| z[amw]) ([^[:alpha:]0-9\-_\.]|$)/$4/ix ) { # PROFILE BLOCK STOP $self->add_url( "$1$3", $encoded, '', '', $prefix ); } # Grab IP addresses while ( $line =~ s/(?update_word( $1, $encoded, '', '', $prefix ); } # Deal with runs of alternating spaces and letters while ( $line =~ s/([ ]|^) # PROFILE BLOCK START ([A-Za-z]([\'\*^`&\. ]|[ ][ ]) (?:[A-Za-z]\3){1,14}[A-Za-z]) ([ ]|\3|[!\?,]|$)/ /x ) { # PROFILE BLOCK STOP my $original = "$1$2$4"; my $word = $2; print "$word ->" if $self->{debug__}; $word =~ s/[^A-Z]//gi; print "$word\n" if $self->{debug__}; $self->update_word( $word, $encoded, ' ', ' ', $prefix ); $self->update_pseudoword( 'trick', 'spacedout', # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP } # Deal with random insertion of . inside words while ( $line =~ s/ ([A-Z]+)\.([A-Z]{2,}) / $1$2 /i ) { $self->update_pseudoword( 'trick', 'dottedwords', # PROFILE BLOCK START $encoded, "$1$2" ); # PROFILE BLOCK STOP } if ( $self->{lang__} eq 'Nihongo' ) { # In Japanese mode, non-symbol EUC-JP characters should be # matched. # # ^$euc_jp*? is added to avoid incorrect matching. # For example, EUC-JP char represented by code A4C8, # should not match the middle of two EUC-JP chars # represented by CCA4 and C8BE, the second byte of the # first char and the first byte of the second char. # In Japanese, one character words are common, so care about # words between 2 and 45 characters while ( $line =~ s/^$euc_jp*? # PROFILE BLOCK START ([A-Za-z][A-Za-z\']{2,44}| $non_symbol_euc_jp{2,45}) (?:[_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$) //ox ) { # PROFILE BLOCK STOP if ( ( $self->{in_headers__} == 0 ) && # PROFILE BLOCK START ( $self->{first20count__} < 20 ) ) { # PROFILE BLOCK STOP $self->{first20count__} += 1; $self->{first20__} .= " $1"; } $self->update_word( # PROFILE BLOCK START $1, $encoded, '', '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]|' . $symbol_euc_jp, $prefix ); # PROFILE BLOCK STOP } } else { if ( $self->{lang__} eq 'Korean' ) { # In Korean mode, [[:alpha:]] in regular # expression is changed to 2bytes chars to support # 2 byte characters. # # In Korean, care about words between 2 and 45 # characters. while ( $line =~ s/(([A-Za-z]|$eksc) # PROFILE BLOCK START ([A-Za-z\']|$eksc){1,44}) ([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$) //x ) { # PROFILE BLOCK STOP if ( ( $self->{in_headers__} == 0 ) && # PROFILE BLOCK START ( $self->{first20count__} < 20 ) ) { # PROFILE BLOCK STOP $self->{first20count__} += 1; $self->{first20__} .= " $1"; } $self->update_word( $1, $encoded, '', # PROFILE BLOCK START '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]', $prefix ) if ( length $1 >= 2 ); # PROFILE BLOCK STOP } } else { # Only care about words between 3 and 45 # characters since short words like an, or, if are # too common and the longest word in English # (according to the OED) is # pneumonoultramicroscopicsilicovolcanoconiosis while ( $line =~ s/([[:alpha:]][[:alpha:]\']{1,44}) # PROFILE BLOCK START ([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$) //x ) { # PROFILE BLOCK STOP if ( ( $self->{in_headers__} == 0 ) && # PROFILE BLOCK START ( $self->{first20count__} < 20 ) ) { # PROFILE BLOCK STOP $self->{first20count__} += 1; $self->{first20__} .= " $1"; } $self->update_word( $1, $encoded, '', # PROFILE BLOCK START '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]', $prefix ) if ( length $1 >= 3 ); # PROFILE BLOCK STOP } } } $p += 1024; } } else { if ( $bigline =~ /[^ \t]/ ) { $self->update_pseudoword( 'trick', 'invisibleink', # PROFILE BLOCK START $encoded, $bigline ); # PROFILE BLOCK STOP } } } # ---------------------------------------------------------------------------- # # update_tag # # Extract elements from within HTML tags that are considered important # 'words' for analysis such as domain names, alt tags, # # $tag The tag name # $arg The arguments # $end_tag Whether this is an end tag or not # $encoded 1 if this HTML was found inside encoded (base64) text # # ---------------------------------------------------------------------------- sub update_tag { my ( $self, $tag, $arg, $end_tag, $encoded ) = @_; # TODO: Make sure $tag only ever gets alphanumeric input (in some # cases it has been demonstrated that things like ()| etc can # end up in $tag $tag =~ s/[\r\n]//g; $arg =~ s/[\r\n]//g; print "HTML " . ( $end_tag ? "closing" : '' ) . " tag $tag with argument $arg\n" if $self->{debug__}; # End tags do not require any argument decoding but we do look at # them to make sure that we handle /font to change the font color if ( $end_tag ) { if ( $tag =~ /^font$/i ) { $self->{htmlfontcolor__} = $self->map_color( 'black' ); $self->compute_html_color_distance(); } # If we hit a table tag then any font information is lost if ( $tag =~ /^(table|td|tr|th)$/i ) { $self->{htmlfontcolor__} = $self->map_color( 'black' ); $self->{htmlbackcolor__} = $self->{htmlbodycolor__}; $self->compute_html_color_distance(); } if ( lc( $tag ) eq $self->{cssbackcolortag__} ) { $self->{htmlbackcolor__} = $self->{htmlbodycolor__}; $self->{cssbackcolortag__} = ''; $self->compute_html_color_distance(); print "CSS back color reset to $self->{htmlbackcolor__} (tag closed: $tag)\n" if $self->{debug__}; } if ( lc( $tag ) eq $self->{cssfontcolortag__} ) { $self->{htmlfontcolor__} = $self->map_color( 'black' ); $self->{cssfontcolortag__} = ''; $self->compute_html_color_distance(); print "CSS font color reset to $self->{htmlfontcolor__} (tag closed: $tag)\n" if $self->{debug__}; } return; } # Count the number of TD elements if ( $tag =~ /^td$/i ) { $self->update_pseudoword( 'html', 'td', $encoded, $tag ); } my $attribute; my $value; # These are used to pass good values to update_word my $quote; my $end_quote; # Strip the first attribute while there are any attributes # Match the closing attribute character, if there is none # (this allows nested single/double quotes), # match a space or > or EOL my $original; while ( $arg =~ s/[ \t]* # PROFILE BLOCK START ((\w+)[ \t]*=[ \t]* (([\"\'])(.*?)\4|([^ \t>]+)($|([ \t>]))) )//x ) { # PROFILE BLOCK STOP $original = $1; $attribute = $2; $value = $5 || $6 || ''; $quote = ''; $end_quote = '[\> \t\&\n]'; if ( defined $4 ) { $quote = $4; $end_quote = $4; } print " attribute $attribute with value $quote$value$quote\n" if $self->{debug__}; # Remove leading whitespace and leading value-less attributes if ( $arg =~ s/^(([ \t]*(\w+)[\t ]+)+)([^=])/$4/ ) { print " attribute(s) $1 with no value\n" if $self->{debug__}; } # Toggle for parsing script URI's. # Should be left off (0) until more is known about how different # html rendering clients behave. my $parse_script_uri = 0; # Tags with src attributes if ( ( $attribute =~ /^src$/i ) && # PROFILE BLOCK START ( ( $tag =~ /^img|frame|iframe$/i ) || ( ( $tag =~ /^script$/i ) && $parse_script_uri ) ) ) { # PROFILE BLOCK STOP # "CID:" links refer to an origin-controlled attachment to # a html email. Adding strings from these, even if they # appear to be hostnames, may or may not be beneficial if ( $value =~ /^(cid)\:/i ) { # Add a pseudo-word when CID source links are detected $self->update_pseudoword( 'html', 'cidsrc', # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP # TODO: I've seen virus messages try to use a CID: href } else { my $host = $self->add_url( $value, $encoded, # PROFILE BLOCK START $quote, $end_quote, '' ); # PROFILE BLOCK STOP # If the host name is not blank (i.e. there was a # hostname in the url and it was an image, then if the # host was not this host then report an off machine # image if ( ( $host ne '' ) && ( $tag =~ /^img$/i ) ) { if ( $host ne 'localhost' ) { $self->update_pseudoword( 'html', 'imgremotesrc', # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP } } if ( ( $host ne '' ) && ( $tag =~ /^iframe$/i ) ) { if ( $host ne 'localhost' ) { $self->update_pseudoword( 'html', 'iframeremotesrc', # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP } } } next; } # Tags with href attributes if ( ( $attribute =~ /^href$/i ) && # PROFILE BLOCK START ( $tag =~ /^(a|link|base|area)$/i ) ) { # PROFILE BLOCK STOP # Look for mailto:'s if ( $value =~ /^mailto:/i ) { if ( ( $tag =~ /^a$/ ) && # PROFILE BLOCK START ( $value =~ /^mailto: ([[:alpha:]0-9\-_\.]+? @ ([[:alpha:]0-9\-_\.]+?)) ([>\&\?\:\/\" \t]|$)/ix ) ) { # PROFILE BLOCK STOP $self->update_word( # PROFILE BLOCK START $1, $encoded, 'mailto:', ( $3 ? '[\\\>\&\?\:\/]' : $end_quote ), '' ); # PROFILE BLOCK STOP $self->add_url( # PROFILE BLOCK START $2, $encoded, '@', ( $3 ? '[\\\&\?\:\/]' : $end_quote ), '' ); # PROFILE BLOCK STOP } } else { # Anything that isn't a mailto is probably an URL $self->add_url( $value, $encoded, $quote, $end_quote, '' ); } next; } # Tags with alt attributes if ( ( $attribute =~ /^alt$/i ) && ( $tag =~ /^img$/i ) ) { $self->add_line( $value, $encoded, '' ); next; } # Tags with working background attributes if ( ( $attribute =~ /^background$/i ) && # PROFILE BLOCK START ( $tag =~ /^(td|table|body)$/i ) ) { # PROFILE BLOCK STOP $self->add_url( $value, $encoded, $quote, $end_quote, '' ); next; } # Tags that load sounds if ( $attribute =~ /^bgsound$/i && $tag =~ /^body$/i ) { $self->add_url( $value, $encoded, $quote, $end_quote, '' ); next; } # Tags with colors in them if ( ( $attribute =~ /^color$/i ) && ( $tag =~ /^font$/i ) ) { $self->update_word( $value, $encoded, $quote, $end_quote, '' ); $self->update_pseudoword( 'html', "fontcolor$value", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP $self->{htmlfontcolor__} = $self->map_color( $value ); $self->compute_html_color_distance(); print "Set html font color to $self->{htmlfontcolor__}\n" if $self->{debug__}; next; } if ( ( $attribute =~ /^text$/i ) && ( $tag =~ /^body$/i ) ) { $self->update_pseudoword( 'html', "fontcolor$value", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP $self->update_word( $value, $encoded, $quote, $end_quote, '' ); $self->{htmlfontcolor__} = $self->map_color( $value ); $self->compute_html_color_distance(); print "Set html font color to $self->{htmlfontcolor__}\n" if $self->{debug__}; next; } # The width and height of images if ( ( $attribute =~ /^(width|height)$/i ) && ( $tag =~ /^img$/i ) ) { $attribute = lc( $attribute ); $self->update_pseudoword( 'html', "img$attribute$value", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP next; } # Font sizes if ( ( $attribute =~ /^size$/i ) && ( $tag =~ /^font$/i ) ) { # TODO: unify font size scaling to use the same scale # across size specifiers $self->update_pseudoword( 'html', "fontsize$value", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP next; } # Tags with background colors if ( ( $attribute =~ /^(bgcolor|back)$/i ) && # PROFILE BLOCK START ( $tag =~ /^(td|table|body|tr|th|font)$/i ) ) { # PROFILE BLOCK STOP $self->update_word( $value, $encoded, $quote, $end_quote, '' ); $self->update_pseudoword( 'html', "backcolor$value", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP $self->{htmlbackcolor__} = $self->map_color( $value ); print "Set html back color to $self->{htmlbackcolor__}\n" if $self->{debug__}; if ( $tag =~ /^body$/i ) { $self->{htmlbodycolor__} = $self->{htmlbackcolor__} } $self->compute_html_color_distance(); next; } # Tags with a charset if ( ( $attribute =~ /^content$/i ) && ( $tag =~ /^meta$/i ) ) { if ( $value =~ /charset=([^\t\r\n ]{1,40})[\"\>]?/ ) { $self->update_word( $1, $encoded, '', '', '' ); } next; } # CSS handling if ( !exists( $HTML::Tagset::emptyElement->{ lc( $tag ) } ) && # PROFILE BLOCK START ( $attribute =~ /^style$/i ) ) { # PROFILE BLOCK STOP print " Inline style tag found in $tag: $attribute=$value\n" if $self->{debug__}; my $style = $self->parse_css_style( $value ); if ( $self->{debug__} ) { # PROFILE BLOCK START print " CSS properties: "; foreach my $key ( keys( %{$style} ) ) { print "$key($style->{$key}), "; } print "\n"; } # PROFILE BLOCK STOP # CSS font sizing if ( defined( $style->{'font-size'} ) ) { my $size = $style->{'font-size'}; # TODO: unify font size scaling to use the same scale # across size specifiers approximate font sizes here: # http://www.dejeu.com/web/tools/tech/css/variablefontsizes.asp if ( $size =~ /(((\+|\-)?\d?\.?\d+) # PROFILE BLOCK START (em|ex|px|%|pt|in|cm|mm|pt|pc))| (xx-small|x-small|small|medium|large|x-large| xx-large)/x ) { # PROFILE BLOCK STOP $self->update_pseudoword( 'html', "cssfontsize$size", # PROFILE BLOCK START $encoded, $original ); # PROFILE BLOCK STOP print " CSS font-size set to: $size\n" if $self->{debug__}; } } # CSS visibility if ( defined( $style->{'visibility'} ) ) { $self->update_pseudoword( # PROFILE BLOCK START 'html', "cssvisibility" . $style->{'visibility'}, $encoded, $original ); # PROFILE BLOCK STOP } # CSS display if ( defined( $style->{'display'} ) ) { $self->update_pseudoword( # PROFILE BLOCK START 'html', "cssdisplay" . $style->{'display'}, $encoded, $original ); # PROFILE BLOCK STOP } # CSS foreground coloring if ( defined( $style->{'color'} ) ) { my $color = $style->{'color'}; print " CSS color: $color\n" if $self->{debug__}; $color = $self->parse_css_color( $color ); if ( $color ne "error" ) { $self->{htmlfontcolor__} = $color; $self->compute_html_color_distance(); print " CSS set html font color to $self->{htmlfontcolor__}\n" if $self->{debug__}; $self->update_pseudoword( # PROFILE BLOCK START 'html', "cssfontcolor$self->{htmlfontcolor__}", $encoded, $original ); # PROFILE BLOCK STOP $self->{cssfontcolortag__} = lc( $tag ); } } # CSS background coloring if ( defined( $style->{'background-color'} ) ) { my $background_color = $style->{'background-color'}; $background_color = # PROFILE BLOCK START $self->parse_css_color( $background_color ); # PROFILE BLOCK STOP if ( $background_color ne "error" ) { $self->{htmlbackcolor__} = $background_color; $self->compute_html_color_distance(); print " CSS set html back color to $self->{htmlbackcolor__}\n" if $self->{debug__}; $self->{htmlbodycolor__} = $background_color # PROFILE BLOCK START if ( $tag =~ /^body$/i ); # PROFILE BLOCK STOP $self->{cssbackcolortag__} = lc( $tag ); $self->update_pseudoword( # PROFILE BLOCK START 'html', "cssbackcolor$self->{htmlbackcolor__}", $encoded, $original ); # PROFILE BLOCK STOP } } # CSS all-in one background declaration (ugh) if ( defined( $style->{'background'} ) ) { my $expression; my $background = $style->{'background'}; # Take the possibly multi-expression "background" property while ( $background =~ s/^([^ \t\r\n\f]+)( |$)// ) { # and examine each expression individually $expression = $1; print " CSS expression $expression in background property\n" if $self->{debug__}; my $background_color = # PROFILE BLOCK START $self->parse_css_color( $expression ); # PROFILE BLOCK STOP # to see if it is a color if ( $background_color ne "error" ) { $self->{htmlbackcolor__} = $background_color; $self->compute_html_color_distance(); print " CSS set html back color to $self->{htmlbackcolor__}\n" if $self->{debug__}; if ( $tag =~ /^body$/i ) { $self->{htmlbodycolor__} = $background_color; } $self->{cssbackcolortag__} = lc( $tag ); $self->update_pseudoword( # PROFILE BLOCK START 'html', "cssbackcolor$self->{htmlbackcolor__}", $encoded, $original ); # PROFILE BLOCK STOP } } } } # TODO: move this up into the style part above # Tags with style attributes (this one may impact # performance!!!) most container tags accept styles, and the # background style may not be in a predictable location # (search the entire value) if ( ( $attribute =~ /^style$/i ) && # PROFILE BLOCK START ( $tag =~ /^(body|td|tr|table|span|div|p)$/i ) ) { # PROFILE BLOCK STOP $self->add_url( $1, $encoded, '[\']', '[\']', '' ) # PROFILE BLOCK START if ( $value =~ /background\-image:[ \t]?url\([ \t]?\'(.*)\'[ \t]?\)/i ); # PROFILE BLOCK STOP next; } # Tags with action attributes if ( $attribute =~ /^action$/i && $tag =~ /^form$/i ) { if ( $value =~ /^(ftp|http|https):\/\//i ) { $self->add_url( $value, $encoded, $quote, $end_quote, '' ); next; } # mailto forms if ( $value =~ /^mailto: # PROFILE BLOCK START ([[:alpha:]0-9\-_\.]+? @ ([[:alpha:]0-9\-_\.]+?)) ([>\&\?\:\/\" \t]|$)/ix ) { # PROFILE BLOCK STOP $self->update_word( # PROFILE BLOCK START $1, $encoded, 'mailto:', ( $3 ? '[\\\>\&\?\:\/]' : $end_quote ), '' ); # PROFILE BLOCK STOP $self->add_url( # PROFILE BLOCK START $2, $encoded, '@', ( $3 ? '[\\\>\&\?\:\/]' : $end_quote ), '' ); # PROFILE BLOCK STOP } next; } } } # ---------------------------------------------------------------------------- # # add_url # # Parses a single url or domain and identifies interesting parts # # $url the domain name to handle # $encoded 1 if the domain was found in encoded text (base64) # $before The character that appeared before the URL in the original line # $after The character that appeared after the URL in the original line # $prefix A string to prefix any words with in the corpus, used for the # special identification of values found in for example the # subject line # $noadd If defined indicates that only parsing should be done, no # word updates # # Returns the hostname # # ---------------------------------------------------------------------------- sub add_url { my ( $self, $url, $encoded, $before, $after, $prefix, $noadd ) = @_; my $temp_url = $url; my $temp_before; my $temp_after; my $hostform; #ip or name # parts of a URL, from left to right my $protocol; my $authinfo; my $host; my $port; my $path; my $query; my $hash; return undef if ( !defined( $url ) ); # Strip the protocol part of a URL (e.g. http://) $protocol = $1 if ( $url =~ s/^([^:]*)\:\/\/// ); # Remove any URL encoding (protocol may not be URL encoded) my $oldurl = $url; my $percents = ( $url =~ s/(%([0-9A-Fa-f]{2}))/chr(hex("0x$2"))/ge ); if ( ( $percents > 0 ) && !defined( $noadd ) ) { $self->update_pseudoword( 'html', 'encodedurl', $encoded, $oldurl ); } # Extract authorization information from the URL # (e.g. http://foo@bar.com) if ( $url =~ s/^(([[:alpha:]0-9\-_\.\;\:\&\=\+\$\,]+)(\@|\%40))+// ) { $authinfo = $1; if ( $authinfo ne '' ) { $self->update_pseudoword( 'html', 'authorization', $encoded, $oldurl ); } } if ( $url =~ s/^(([[:alpha:]0-9\-_]+\.)+) # PROFILE BLOCK START (aero|arpa|asia|biz|cat|com|coop|edu|gov|info| int|jobs|mil|mobi|museum|name|net|org|pro|tel| travel|xxx|[a-z]{2}) ([^[:alpha:]0-9\-_\.]|$)/$4/ix ) { # PROFILE BLOCK STOP $host = "$1$3"; $hostform = "name"; } else { if ( $url =~ /(([^:\/])+)/ ) { # Some other hostname format found, maybe # Read here for reference: http://www.pc-help.org/obscure.htm # Go here for comparison: http://www.samspade.org/t/url # save the possible hostname my $host_candidate = $1; # stores discovered IP address my %quads; # temporary values my $quad = 1; my $number; # iterate through the possible hostname, build dotted quad # format while ( $host_candidate =~ # PROFILE BLOCK START s/\G^((0x)[0-9A-Fa-f]+|0[0-7]+|[0-9]+)(\.)?// ) { # PROFILE BLOCK STOP my $hex = $2; # possible IP quad(s) my $quad_candidate = $1; my $more_dots = $3; if ( defined $hex ) { # hex number # trim arbitrary octets that are greater than most # significant bit $quad_candidate =~ s/.*(([0-9A-F][0-9A-F]){4})$/$1/i; $number = hex( $quad_candidate ); } else { if ( $quad_candidate =~ /^0([0-7]+)/ ) { # octal number $number = oct( $1 ); } else { # assume decimal number # deviates from the obscure.htm document here, # no current browsers overflow $number = int( $quad_candidate ); } } # No more IP dots? if ( !defined( $more_dots ) ) { # Expand final decimal/octal/hex to extra quads while ( $quad <= 4 ) { my $shift = ( ( 4 - $quad ) * 8 ); $quads{$quad} = # PROFILE BLOCK START ( $number & ( hex( "0xFF" ) << $shift ) ) >> $shift; # PROFILE BLOCK STOP $quad += 1; } } else { # Just plug the quad in, no overflow allowed $quads{$quad} = $number if ( $number < 256 ); $quad += 1; } last if ( $quad > 4 ); } $host_candidate =~ s/\r|\n|$//g; if ( ( $host_candidate eq '' ) && # PROFILE BLOCK START defined( $quads{1} ) && defined( $quads{2} ) && defined( $quads{3} ) && defined( $quads{4} ) && !defined( $quads{5} ) ) { # PROFILE BLOCK STOP # we did actually find an IP address, and not some fake $hostform = "ip"; $host = "$quads{1}.$quads{2}.$quads{3}.$quads{4}"; $url =~ s/(([^:\/])+)//; } } } if ( !defined( $host ) || ( $host eq '' ) ) { print "no hostname found: [$temp_url]\n" if $self->{debug__}; return ''; } $port = $1 if ( $url =~ s/^\:(\d+)// ); $path = $1 if ( $url =~ s/^([\\\/][^\#\?\n]*)($)?// ); $query = $1 if ( $url =~ s/^[\?]([^\#\n]*|$)?// ); $hash = $1 if ( $url =~ s/^[\#](.*)$// ); if ( !defined( $protocol ) || ( $protocol =~ /^(http|https)$/ ) ) { $temp_before = $before; $temp_before = "\:\/\/" if ( defined $protocol ); $temp_before = "[\@]" if ( defined $authinfo ); $temp_after = $after; $temp_after = "[\#]" if ( defined $hash ); $temp_after = "[\?]" if ( defined $query ); $temp_after = "[\\\\\/]" if ( defined $path ); $temp_after = "[\:]" if ( defined $port ); # add the entire domain $self->update_word( # PROFILE BLOCK START $host, $encoded, $temp_before, $temp_after, $prefix ) if ( !defined( $noadd ) ); # PROFILE BLOCK STOP # decided not to care about tld's beyond the verification # performed when grabbing $host special subTLD's can just get # their own classification weight (eg, .bc.ca) # http://www.0dns.org has a good reference of ccTLD's and # their sub-tld's if desired if ( $hostform eq 'name' ) { # recursively add the roots of the domain while ( $host =~ s/^([^\.]+\.)?(([^\.]+\.?)*)(\.[^\.]+)$/$2$4/ ) { if ( !defined( $1 ) ) { $self->update_word( # PROFILE BLOCK START $4, $encoded, $2, '[<]', $prefix) if ( !defined( $noadd ) ); # PROFILE BLOCK STOP last; } $self->update_word( # PROFILE BLOCK START $host, $encoded, $1 || $2, '[<]', $prefix) if ( !defined( $noadd ) ); # PROFILE BLOCK STOP } } } # $protocol $authinfo $host $port $query $hash may be processed # below if desired return $host; } # ---------------------------------------------------------------------------- # # parse_html # # Parse a line that might contain HTML information, returns 1 if we # are still inside an unclosed HTML tag # # $line A line of text # $encoded 1 if this HTML was found inside encoded (base64) text # # ---------------------------------------------------------------------------- sub parse_html { my ( $self, $line, $encoded ) = @_; my $found = 1; $line =~ s/[\r\n]+/ /gm; print "parse_html: [$line] " . $self->{in_html_tag__} . "\n" if $self->{debug__}; # Remove HTML comments and other tags that begin ! while ( $line =~ s/()// ) { $self->update_pseudoword( 'html', 'comment', $encoded, $1 ); print "$line\n" if $self->{debug__}; } # Remove invalid tags. This finds tags of the form [a-z0-9]+ with # optional attributes and removes them if the tag isn't # recognized. # TODO: This also removes tags in plain text emails so a sentence # such as 'To run the program type "program ".' is also # effected. The correct fix seams to be to look at the # Content-Type header and only process mails of type text/html. while ( $line =~ s/(<\/?(?!(?:$spacing_tags|$non_spacing_tags)\W) # PROFILE BLOCK START [a-z0-9]+(?:\s+.*?)?\/?>)//iox ) { # PROFILE BLOCK STOP $self->update_pseudoword( 'html', 'invalidtag', $encoded, $1 ); print "html:invalidtag: $1\n" if $self->{debug__}; } # Remove pairs of non-spacing tags without content such as # and also . # TODO: What about combined open and close tags such as ? while ( $line =~ s/(<($non_spacing_tags)(?:\s+[^>]*?)?><\/\2>)//io ) { $self->update_pseudoword( 'html', 'emptypair', $encoded, $1 ); print "html:emptypair: $1\n" if $self->{debug__}; } while ( $found && ( $line ne '' ) ) { $found = 0; # If we are in an HTML tag then look for the close of the tag, # if we get it then handle the tag, if we don't then keep # building up the arguments of the tag if ( $self->{in_html_tag__} ) { if ( $line =~ s/^([^>]*?)>// ) { $self->{html_arg__} .= $1; $self->{in_html_tag__} = 0; $self->{html_tag__} =~ s/=\n ?//g; $self->{html_arg__} =~ s/=\n ?//g; $self->update_tag( $self->{html_tag__}, $self->{html_arg__}, # PROFILE BLOCK START $self->{html_end}, $encoded ); # PROFILE BLOCK STOP $self->{html_tag__} = ''; $self->{html_arg__} = ''; $found = 1; next; } else { $self->{html_arg__} .= $line; return 1; } } # Does the line start with a HTML tag that is closed (i.e. has # both the < and the > present)? If so then handle that tag # immediately and continue if ( $line =~ s/^<([\/]?)([A-Za-z]+)([^>]*?)>// ) { $self->update_tag( $2, $3, ( $1 eq '/' ), $encoded ); $found = 1; next; } # Does the line consist of just a tag that has no closing > # then set up the global vars that record the tag and return 1 # to indicate to the caller that we have an unclosed tag if ( $line =~ /^<([\/]?)([A-Za-z][^ >]+)([^>]*)$/ ) { $self->{html_end} = ( $1 eq '/' ); $self->{html_tag__} = $2; $self->{html_arg__} = $3; $self->{in_html_tag__} = 1; return 1; } # There could be something on the line that needs parsing # (such as a word), if we reach here then we are not in an # unclosed tag and so we can grab everything from the start of # the line to the end or the first < and pass it to the line # parser if ( $line =~ s/^([^<]+)(<|$)/$2/ ) { $found = 1; $self->add_line( $1, $encoded, '' ); } } return 0; } # ---------------------------------------------------------------------------- # # parse_file # # Read messages from file and parse into a list of words and # frequencies, returns a colorized HTML version of message if color is # set # # $file The file to open and parse # $max_size The maximum size of message to parse, or 0 for unlimited # $reset If set to 0 then the list of words from a previous parse is not # reset, this can be used to do multiple parses and build a single # word list. By default this is set to 1 and the word list is reset # # ---------------------------------------------------------------------------- sub parse_file { my ( $self, $file, $max_size, $reset ) = @_; $reset = 1 if ( !defined( $reset ) ); $max_size = 0 if ( !defined( $max_size ) || ( $max_size =~ /\D/ ) ); $self->start_parse( $reset ); my $size_read = 0; open MSG, "<$file"; binmode MSG; # Read each line and find each "word" which we define as a # sequence of alpha characters while ( ) { $size_read += length( $_ ); $self->parse_line( $_ ); if ( ( $max_size > 0 ) && # PROFILE BLOCK START ( $size_read > $max_size ) ) { # PROFILE BLOCK STOP last; } } close MSG; $self->stop_parse(); if ( $self->{color__} ne '' ) { $self->{colorized__} .= $self->{ut__} if ( $self->{ut__} ne '' ); $self->{colorized__} .= ""; $self->{colorized__} =~ s/(\r\n\r\n|\r\r|\n\n)/__BREAK____BREAK__/g; $self->{colorized__} =~ s/[\r\n]+/__BREAK__/g; $self->{colorized__} =~ s/__BREAK__/
/g; return $self->{colorized__}; } else { return ''; } } # ---------------------------------------------------------------------------- # # start_parse # # Called to reset internal variables before parsing. This is # automatically called when using the parse_file API, and must be # called before the first call to parse_line. # # $reset If set to 0 then the list of words from a previous parse is not # reset, this can be used to do multiple parses and build a single # word list. By default this is set to 1 and the word list is reset # # ---------------------------------------------------------------------------- sub start_parse { my ( $self, $reset ) = @_; $reset = 1 if ( !defined( $reset ) ); # This will contain the mime boundary information in a mime message $self->{mime__} = ''; # Contains the encoding for the current block in a mime message $self->{encoding__} = ''; # Variables to save header information to while parsing headers $self->{header__} = ''; $self->{argument__} = ''; # Clear the word hash $self->{content_type__} = ''; # Base64 attachments are loaded into this as we read them $self->{base64__} = ''; # Variable to note that the temporary colorized storage is # "frozen", and what type of freeze it is (allows nesting of # reasons to freeze colorization) $self->{in_html_tag__} = 0; $self->{html_tag__} = ''; $self->{html_arg__} = ''; if ( $reset ) { $self->{words__} = {}; } $self->{msg_total__} = 0; $self->{from__} = ''; $self->{to__} = ''; $self->{cc__} = ''; $self->{subject__} = ''; $self->{ut__} = ''; $self->{quickmagnets__} = {}; $self->{htmlbodycolor__} = $self->map_color( 'white' ); $self->{htmlbackcolor__} = $self->map_color( 'white' ); $self->{htmlfontcolor__} = $self->map_color( 'black' ); $self->compute_html_color_distance(); $self->{in_headers__} = 1; $self->{first20__} = ''; $self->{first20count__} = 0; # Used to return a colorize page $self->{colorized__} = ''; $self->{colorized__} .= "" if ( $self->{color__} ne '' ); # Clear the character set to avoid using the wrong charsets $self->{charset__} = ''; if ( $self->{lang__} eq 'Nihongo' ) { # Since Text::Kakasi is not thread-safe, we use it under the # control of a Mutex to avoid a crash if we are running on # Windows. if ( $self->{need_kakasi_mutex__} ) { require POPFile::Mutex; $self->{kakasi_mutex__}->acquire(); } # Initialize Nihongo (Japanese) parser $self->{nihongo_parser__}{init}( $self ); } } # ---------------------------------------------------------------------------- # # stop_parse # # Called at the end of a parse job. Automatically called if # parse_file is used, must be called after the last call to # parse_line. # # ---------------------------------------------------------------------------- sub stop_parse { my ( $self ) = @_; $self->{colorized__} .= $self->clear_out_base64(); $self->clear_out_qp(); # If we reach here and discover that we think that we are in an # unclosed HTML tag then there has probably been an error (such as # a < in the text messing things up) and so we dump whatever is # stored in the HTML tag out if ( $self->{in_html_tag__} ) { $self->add_line( "$self->{html_tag__} $self->{html_arg__}", 0, '' ); } # if we are here, and still have headers stored, we must have a # bodyless message # TODO: Fix me if ( $self->{header__} ne '' ) { $self->parse_header( $self->{header__}, $self->{argument__}, # PROFILE BLOCK START $self->{mime__}, $self->{encoding__} ); # PROFILE BLOCK STOP $self->{header__} = ''; $self->{argument__} = ''; } $self->{in_html_tag__} = 0; if ( $self->{lang__} eq 'Nihongo' ) { # Close Nihongo (Japanese) parser $self->{nihongo_parser__}{close}( $self ); if ( $self->{need_kakasi_mutex__} ) { require POPFile::Mutex; $self->{kakasi_mutex__}->release(); } } } # ---------------------------------------------------------------------------- # # parse_line # # Called to parse a single line from a message. If using this API # directly then be sure to call start_parse before the first call to # parse_line. # # $line Line of file to parse # # ---------------------------------------------------------------------------- sub parse_line { my ( $self, $read ) = @_; if ( $read ne '' ) { # For the Mac we do further splitting of the line at the CR # characters while ( $read =~ s/(.*?)[\r\n]+// ) { my $line = "$1\r\n"; next if ( !defined( $line ) ); print ">>> $line" if $self->{debug__}; # Decode quoted-printable if ( !$self->{in_headers__} && # PROFILE BLOCK START ( $self->{encoding__} =~ /quoted\-printable/i ) ) { # PROFILE BLOCK STOP if ( $line =~ s/=\r\n$// ) { # Encoded in multiple lines $self->{prev__} .= $line; next; } else { $line = $self->{prev__} . $line; $self->{prev__} = ''; } $line = decode_qp( $line ); $line =~ s/\x00/NUL/g; } if ( ( $self->{lang__} eq 'Nihongo' ) && # PROFILE BLOCK START !$self->{in_headers__} && ( $self->{encoding__} !~ /base64/i ) ) { # PROFILE BLOCK STOP # Decode \x?? $line =~ s/\\x([8-9A-F][A-F0-9])/pack("C", hex($1))/eig; $line = convert_encoding( # PROFILE BLOCK START $line, $self->{charset__}, 'euc-jp', '7bit-jis', @{ $encoding_candidates{ $self->{lang__} } } ); # PROFILE BLOCK STOP $line = $self->{nihongo_parser__}{parse}( $self, $line ); } if ( $self->{color__} ne '' ) { if ( !$self->{in_html_tag__} ) { $self->{colorized__} .= $self->{ut__}; $self->{ut__} = ''; } $self->{ut__} .= $self->splitline( $line, # PROFILE BLOCK START $self->{encoding__} ); # PROFILE BLOCK STOP } if ( $self->{in_headers__} ) { # temporary colorization while in headers is handled # within parse_header $self->{ut__} = ''; # Check for blank line signifying end of headers if ( $line =~ /^(\r\n|\r|\n)/ ) { # Parse the last header ( $self->{mime__}, $self->{encoding__} ) = # PROFILE BLOCK START $self->parse_header( $self->{header__}, $self->{argument__}, $self->{mime__}, $self->{encoding__} ); # PROFILE BLOCK STOP # Clear the saved headers $self->{header__} = ''; $self->{argument__} = ''; $self->{ut__} .= $self->splitline( "\015\012", 0 ); $self->{ut__} .= ""; $self->{in_headers__} = 0; print "Header parsing complete.\n" if $self->{debug__}; next; } # Append to argument if the next line begins with # whitespace (isn't a new header) if ( $line =~ /^([\t ])([^\r\n]+)/ ) { $self->{argument__} .= "$eol$1$2"; next; } # If we have an email header then split it into the # header and its argument if ( $line =~ /^([A-Za-z\-]+):[ \t]*([^\n\r]*)/ ) { # Parse the last header ( $self->{mime__}, $self->{encoding__} ) = # PROFILE BLOCK START $self->parse_header( $self->{header__}, $self->{argument__}, $self->{mime__}, $self->{encoding__} ) if ( $self->{header__} ne '' ); # PROFILE BLOCK STOP # Save the new information for the current header $self->{header__} = $1; $self->{argument__} = $2; next; } next; } # If we are in a mime document then spot the boundaries if ( ( $self->{mime__} ne '' ) && # PROFILE BLOCK START ( $line =~ /^\-\-($self->{mime__})(\-\-)?/ ) ) { # PROFILE BLOCK STOP # approach each mime part with fresh eyes $self->{encoding__} = ''; if ( !defined( $2 ) ) { # This means there was no trailing -- on the mime # boundary (which would have indicated the end of # a boundary, so now we have a new part of the # document, hence we need to look for new headers print "Hit MIME boundary --$1\n" if $self->{debug__}; $self->clear_out_qp(); # Decode base64 for every part. $self->{colorized__} .= $self->clear_out_base64() . "\n\n"; $self->{in_headers__} = 1; } else { # A boundary was just terminated $self->{in_headers__} = 0; my $boundary = $1; print "Hit MIME boundary terminator --$1--\n" if $self->{debug__}; # Escape to match escaped boundary characters $boundary =~ s/(.*)/\Q$1\E/g; # Remove the boundary we just found from the # boundary list. The list is stored in # $self->{mime__} and consists of mime boundaries # separated by the alternation characters | for # use within a regexp my $temp_mime = ''; foreach my $aboundary ( split( /\|/, $self->{mime__} ) ) { if ( $boundary ne $aboundary ) { if ( $temp_mime ne '' ) { $temp_mime = join( '|', # PROFILE BLOCK START $temp_mime, $aboundary ); # PROFILE BLOCK STOP } else { $temp_mime = $aboundary; } } } $self->{mime__} = $temp_mime; print "MIME boundary list now $self->{mime__}\n" if $self->{debug__}; } next; } # If we are doing base64 decoding then look for suitable # lines and remove them for decoding if ( $self->{encoding__} =~ /base64/i ) { $line =~ s/[\r\n]//g; $line =~ s/!$//; $self->{base64__} .= $line; next; } next if ( !defined( $line ) ); $self->parse_html( $line, 0 ); } } } # ---------------------------------------------------------------------------- # # clear_out_base64 # # If there's anything in the {base64__} then decode it and parse it, # returns colorization information to be added to the colorized output # # ---------------------------------------------------------------------------- sub clear_out_base64 { my ( $self ) = @_; my $colorized = ''; if ( $self->{base64__} ne '' ) { my $decoded = ''; $self->{ut__} = '' if ( $self->{color__} ne '' ); $self->{base64__} =~ s/ //g; print "Base64 data: " . $self->{base64__} . "\n" if $self->{debug__}; $decoded = decode_base64( $self->{base64__} ); if ( $self->{lang__} eq 'Nihongo' ) { $decoded = convert_encoding( # PROFILE BLOCK START $decoded, $self->{charset__}, 'euc-jp', '7bit-jis', @{ $encoding_candidates{ $self->{lang__} } } ); # PROFILE BLOCK STOP $decoded = $self->{nihongo_parser__}{parse}( $self, $decoded ); } $self->parse_html( $decoded, 1 ); print "Decoded: " . $decoded . "\n" if $self->{debug__}; if ( $self->{color__} ne '' ) { $self->{ut__} = "Found in encoded data: " . $self->{ut__}; } if ( $self->{color__} ne '' ) { if ( $self->{ut__} ne '' ) { $colorized = $self->{ut__}; $self->{ut__} = ''; } } } $self->{base64__} = ''; return $colorized; } # ---------------------------------------------------------------------------- # # clear_out_qp # # If there's anything in the {prev__} then decode it and parse it # # ---------------------------------------------------------------------------- sub clear_out_qp { my ( $self ) = @_; if ( ( $self->{encoding__} =~ /quoted\-printable/i ) && ( $self->{prev__} ne '' ) ) { my $line = decode_qp( $self->{prev__} ); $line =~ s/\x00/NUL/g; if ( $self->{lang__} eq 'Nihongo' ) { $line = convert_encoding( $line, $self->{charset__}, 'euc-jp', '7bit-jis', @{ $encoding_candidates{ $self->{lang__} } } ); $line = $self->{nihongo_parser__}{parse}( $self, $line ); } $self->{ut__} .= $self->splitline( $line, '' ); $self->parse_html( $line, 0 ); $self->{prev__} = ''; } } # ---------------------------------------------------------------------------- # # decode_string - Decode MIME encoded strings used in the header lines # in email messages # # $mystring - The string that neeeds decode # # Return the decoded string, this routine recognizes lines of the form # # =?charset?[BQ]?text?= # # $lang Pass in the current interface language for language specific # encoding conversion A B indicates base64 encoding, a Q indicates # quoted printable encoding # ---------------------------------------------------------------------------- sub decode_string { # I choose not to use "$mystring = MIME::Base64::decode( $1 );" # because some spam mails have subjects like: "Subject: adjpwpekm # =?ISO-8859-1?Q?=B2=E1=A4=D1=AB=C7?= dopdalnfjpw". Therefore we # proceed along the string, from left to right, building a new # string from the decoded and non-decoded parts my ( $self, $mystring, $lang ) = @_; my $charset = ''; return '' if ( !defined( $mystring ) ); $lang = $self->{lang__} if ( !defined( $lang ) || ( $lang eq '' ) ); my $output = ''; my $last_is_encoded = 0; while ( $mystring =~ m/(.*?)(=\?([\w-]+)\?(B|Q)\?(.*?)\?=)/igc ) { my ( $pre, $atom, $encoding, $value ); ( $pre, $atom, $charset, $encoding, $value ) = ( $1, $2, $3, $4, $5 ); $output .= $pre unless ( $last_is_encoded && defined( $atom ) # PROFILE BLOCK START && ( $pre =~ /^[\t ]+$/ ) ); # PROFILE BLOCK STOP( Per RFC 2047 section 6.2 ) if ( defined( $atom ) ) { if ( $encoding =~ /^[bB]$/ ) { $value = decode_base64( $value ); # for Japanese header if ( $lang eq 'Nihongo' ) { $value = convert_encoding( # PROFILE BLOCK START $value, $charset, 'euc-jp', '7bit-jis', @{ $encoding_candidates{ $self->{lang__} } } ); # PROFILE BLOCK STOP } $last_is_encoded = 1; } elsif ( $encoding =~ /^[qQ]$/ ) { $value =~ s/\_/=20/g; $value = decode_qp( $value ); $value =~ s/\x00/NUL/g; # for Japanese header if ( $lang eq 'Nihongo' ) { $value = convert_encoding( # PROFILE BLOCK START $value, $charset, 'euc-jp', '7bit-jis', @{ $encoding_candidates{ $self->{lang__} } } ); # PROFILE BLOCK STOP } $last_is_encoded = 1; } } else { $last_is_encoded = 0; } $output .= $value || ''; } # grab the unmatched tail (thanks to /gc and \G) $output .= $1 if ( $mystring =~ m/\G(.*)/g ); return $output; } # ---------------------------------------------------------------------------- # # get_header - Returns the value of the from, to, subject or cc header # # $header Name of header to return (note must be lowercase) # # ---------------------------------------------------------------------------- sub get_header { my ( $self, $header ) = @_; return $self->{ $header . '__' } || ''; } # ---------------------------------------------------------------------------- # # parse_header - Performs parsing operations on a message header # # $header Name of header being processed # $argument Value of header being processed # $mime The presently saved mime boundaries list # $encoding Current message encoding # # ---------------------------------------------------------------------------- sub parse_header { my ( $self, $header, $argument, $mime, $encoding ) = @_; print "Header ($header) ($argument)\n" if $self->{debug__}; # After a discussion with Tim Peters and some looking at emails # I'd received I discovered that the header names (case sensitive) # are very significant in identifying different types of mail, for # example much spam uses MIME-Version, MiME-Version and # Mime-Version my $fix_argument = $argument; $fix_argument =~ s//>/g; $argument =~ s/(\r\n|\r|\n)//g; $argument =~ s/^[ \t]+//; if ( $self->update_pseudoword( 'header', $header, 0, $header ) ) { if ( $self->{color__} ne '' ) { my $color = $self->get_color__( "header:$header" ); $self->{ut__} = "$header: $fix_argument\015\012"; } } else { if ( $self->{color__} ne '' ) { $self->{ut__} = "$header: $fix_argument\015\012"; } } # Check the encoding type in all RFC 2047 encoded headers if ( $argument =~ /=\?([^\r\n\t ]{1,40})\?(Q|B)/i ) { $self->update_word( $1, 0, '', '', 'charset' ); } # Handle the From, To and Cc headers and extract email addresses # from them and treat them as words # For certain headers we are going to mark them specially in the # corpus by tagging them with where they were found to help the # classifier do a better job. So if you have # # From: foo@bar.com # # then we'll add from:foo@bar.com to the corpus and not just # foo@bar.com my $prefix = ''; if ( $header =~ /^(From|To|Cc|Reply\-To)$/i ) { # These headers at least can be decoded $argument = $self->decode_string( $argument, $self->{lang__} ); if ( $header =~ /^From$/i ) { $prefix = 'from'; if ( $self->{from__} eq '' ) { $self->{from__} = $argument; $self->{from__} =~ s/[\t\r\n]//g; } } if ( $header =~ /^To$/i ) { $prefix = 'to'; if ( $self->{to__} eq '' ) { $self->{to__} = $argument; $self->{to__} =~ s/[\t\r\n]//g; } } if ( $header =~ /^Cc$/i ) { $prefix = 'cc'; if ( $self->{cc__} eq '' ) { $self->{cc__} = $argument; $self->{cc__} =~ s/[\t\r\n]//g; } } while ( $argument =~ s/<([[:alpha:]0-9\-_\.]+?@([[:alpha:]0-9\-_\.]+?))>// ) { $self->update_word( $1, 0, ';', '&', $prefix ); $self->add_url( $2, 0, '@', '[&<]', $prefix ); } while ( $argument =~ s/([[:alpha:]0-9\-_\.]+?@([[:alpha:]0-9\-_\.]+))// ) { $self->update_word( $1, 0, '', '', $prefix ); $self->add_url( $2, 0, '@', '', $prefix ); } $self->add_line( $argument, 0, $prefix ); return ( $mime, $encoding ); } if ( $header =~ /^Subject$/i ) { $prefix = 'subject'; $argument = $self->decode_string( $argument, $self->{lang__} ); if ( $self->{subject__} eq '' ) { # In Japanese mode, parse subject with Nihongo (Japanese) parser $argument = $self->{nihongo_parser__}{parse}( $self, $argument ) # PROFILE BLOCK START if ( ( $self->{lang__} eq 'Nihongo' ) && ( $argument ne '' ) ); # PROFILE BLOCK STOP $self->{subject__} = $argument; $self->{subject__} =~ s/[\t\r\n]//g; } } $self->{date__} = $argument if ( $header =~ /^Date$/i ); if ( $header =~ /^X-Spam-Status$/i ) { # We have found a header added by SpamAssassin. We expect to # find keywords in here that will help us classify our # messages # We will find the keywords after the phrase "tests=" and # before SpamAssassin's version number or autolearn= string ( my $sa_keywords = $argument ) =~ s/[\r\n ]//sg; $sa_keywords =~ s/^.+tests=(.+)/$1/; $sa_keywords =~ s/(.+)autolearn.+$/$1/ or # PROFILE BLOCK START $sa_keywords =~ s/(.+)version.+$/$1/; # PROFILE BLOCK STOP # remove all spaces that may still be present: $sa_keywords =~ s/[\t ]//g; foreach ( split /,/, $sa_keywords ) { $self->update_pseudoword( 'spamassassin', lc( $_ ), 0, $argument ); } } if ( $header =~ /^X-SpamViper-Score$/ ) { # This is a header that was added by SpamViper. Works just # like the SpamAssassin header. ( my $sv_keywords = $argument ) =~ s/[\r\n]//g; # The keywords can be found after the phrase "Mail scored X # points": $sv_keywords =~ s/Mail scored \d+ points //; $sv_keywords =~ s/[\t ]//g; foreach ( split /,/, $sv_keywords ) { $self->update_pseudoword( 'spamviper', lc( $_ ), 0, $argument ); } } if ( $header =~ /^X-Spam-Level$/i ) { my $count = ( $argument =~ tr/*// ); for ( 1 .. $count ) { $self->update_pseudoword( 'spamassassinlevel', 'spam', # PROFILE BLOCK START 0, $argument ); # PROFILE BLOCK STOP } } # Look for MIME if ( $header =~ /^Content-Type$/i ) { if ( $argument =~ /charset=\"?([^\"\r\n\t ]{1,40})\"?/ ) { $self->{charset__} = $1; $self->update_word( $1, 0, '', '', 'charset' ); } if ( $argument =~ /^(.*?)(;)/ ) { print "Set content type to $1\n" if $self->{debug__}; $self->{content_type__} = $1; } if ( $argument =~ /multipart\//i ) { my $boundary = $argument; if ( $boundary =~ /boundary=[ ]? # PROFILE BLOCK START (\"([A-Z0-9\'\(\)\+\_\,\-\.\/\:\=\?] [A-Z0-9\'\(\)\+_,\-\.\/:=\? \@]{0,69})\"| ([^\(\)\<\>\@\,\;\:\\\"\/\[\]\?\=]{1,70}) )/ix ) { # PROFILE BLOCK STOP $boundary = ( $2 || $3 ); $boundary =~ s/(.*)/\Q$1\E/g; if ( $mime ne '' ) { # Fortunately the pipe character isn't a valid # mime boundary character! $mime = join( '|', $mime, $boundary ); } else { $mime = $boundary; } print "Set mime boundary to $mime\n" if $self->{debug__}; return ( $mime, $encoding ); } } if ( $argument =~ /name=\"(.*)\"/i ) { $self->add_attachment_filename( $1 ); } return ( $mime, $encoding ); } # Look for the different encodings in a MIME document, when we hit # base64 we will do a special parse here since words might be # broken across the boundaries if ( $header =~ /^Content-Transfer-Encoding$/i ) { $encoding = $argument; print "Setting encoding to $encoding\n" if $self->{debug__}; my $compact_encoding = $encoding; $compact_encoding =~ s/[^A-Za-z0-9]//g; $self->update_pseudoword( 'encoding', $compact_encoding, # PROFILE BLOCK START 0, $encoding ); # PROFILE BLOCK STOP return ( $mime, $encoding ); } # Some headers to discard return ( $mime, $encoding ) # PROFILE BLOCK START if ( $header =~ /^(Thread-Index|X-UIDL|Message-ID| X-Text-Classification|X-Mime-Key)$/ix ); # PROFILE BLOCK STOP # Some headers should never be RFC 2047 decoded $argument = $self->decode_string( $argument, $self->{lang__} ) # PROFILE BLOCK START if ( $header !~ /^(Received|Content\-Type|Content\-Disposition)$/i ); # PROFILE BLOCK STOP if ( $header =~ /^Content-Disposition$/i ) { $self->handle_disposition( $argument ); return ( $mime, $encoding ); } $self->add_line( $argument, 0, $prefix ); return ( $mime, $encoding ); } # ---------------------------------------------------------------------------- # # parse_css_ruleset - Parses text for CSS declarations # Uses the second part of the "ruleset" grammar # # $line The line to match # $braces 1 if braces are included, 0 if excluded. Defaults to 0. # (optional) # Returns A hash of properties containing their expressions # # ---------------------------------------------------------------------------- sub parse_css_style { my ( $self, $line, $braces ) = @_; # http://www.w3.org/TR/CSS2/grammar.html $braces = 0 if ( !defined( $braces ) ); # A reference is used to return data my $hash = {}; if ( $braces ) { $line =~ s/\{(.*?)\}/$1/; } while ( $line =~ s/^[ \t\r\n\f]* # PROFILE BLOCK START ([a-z][a-z0-9\-]+)[ \t\r\n\f]*: [ \t\r\n\f]*(.*?)[ \t\r\n\f]?(;|$)//ix ) { # PROFILE BLOCK STOP $hash->{ lc( $1 ) } = $2; } return $hash; } # ---------------------------------------------------------------------------- # # parse_css_color - Parses a CSS color string # # $color The string to parse # Returns (r,g,b) triplet in list context, rrggbb (hex) color in scalar # context # # In case of an error: (-1,-1,-1) in list context, "error" in scalar # context # # ---------------------------------------------------------------------------- sub parse_css_color { my ( $self, $color ) = @_; # CSS colors can be in a rgb(r,g,b), #hhh, #hhhhhh or a named color form # http://www.w3.org/TR/CSS2/syndata.html#color-units my ( $r, $g, $b, $error, $found ) = ( 0, 0, 0, 0, 0 ); if ( $color =~ /^rgb\( ?(.*?) ?\, ?(.*?) ?\, ?(.*?) ?\)$/ ) { # rgb(r,g,b) can be expressed as values 0-255 or percentages 0%-100%, # numbers outside this range are allowed and should be clipped into # this range # TODO: store front/back colors in a RGB hash/array # converting to a hh hh hh format and back # is a waste as is repeatedly decoding # from hh hh hh format ( $r, $g, $b ) = ( $1, $2, $3 ); my $ispercent = 0; my $value_re = qr/^((-[1-9]\d*)|([1-9]\d*|0))$/; my $percent_re = qr/^([1-9]\d+|0)%$/; my ( $r_temp, $g_temp, $b_temp ); if ( ( ($r_temp) = ($r =~ $percent_re) ) && # PROFILE BLOCK START ( ($g_temp) = ($g =~ $percent_re) ) && ( ($b_temp) = ($b =~ $percent_re) ) ) { # PROFILE BLOCK STOP $ispercent = 1; # clip to 0-100 $r_temp = 100 if ( $r_temp > 100 ); $g_temp = 100 if ( $g_temp > 100 ); $b_temp = 100 if ( $b_temp > 100 ); # convert into 0-255 range $r = int( ( ( $r_temp / 100 ) * 255 ) + .5 ); $g = int( ( ( $g_temp / 100 ) * 255 ) + .5 ); $b = int( ( ( $b_temp / 100 ) * 255 ) + .5 ); $found = 1; } if ( ( $r =~ $value_re ) && # PROFILE BLOCK START ( $g =~ $value_re ) && ( $b =~ $value_re ) ) { # PROFILE BLOCK STOP $ispercent = 0; #clip to 0-255 $r = 0 if ( $r <= 0 ); $r = 255 if ( $r >= 255 ); $g = 0 if ( $g <= 0 ); $g = 255 if ( $g >= 255 ); $b = 0 if ( $b <= 0 ); $b = 255 if ( $b >= 255 ); $found = 1; } if ( !$found ) { # here we have a combination of percentages and integers # or some other oddity $ispercent = 0; $error = 1; } print " CSS rgb($r, $g, $b) percent: $ispercent\n" if $self->{debug__}; } if ( $color =~ /^#(([0-9a-f]{3})|([0-9a-f]{6}))$/i ) { # #rgb or #rrggbb print " CSS numeric form: $color\n" if $self->{debug__}; $color = $2 || $3; if ( defined( $2 ) ) { # in 3 value form, the value is computed by doubling each digit ( $r, $g, $b ) = ( hex( $1 x 2 ), hex( $2 x 2 ), hex( $3 x 2 ) ) # PROFILE BLOCK START if ( $color =~ /^(.)(.)(.)$/ ); # PROFILE BLOCK STOP } else { ( $r, $g, $b ) = ( hex( $1 ), hex( $2 ), hex( $3 ) ) # PROFILE BLOCK START if ( $color =~ /^(..)(..)(..)$/ ); # PROFILE BLOCK STOP } $found = 1; } if ( $color =~ /^(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy| # PROFILE BLOCK START olive|purple|red|silver|teal|white|yellow)$/i ) { # PROFILE BLOCK STOP # these are the only CSS defined colours print " CSS textual color form: $color\n" if $self->{debug__}; my $new_color = $self->map_color( $color ); # our color map may have failed $error = 1 if ( $new_color eq $color ); ( $r, $g, $b ) = ( hex( $1 ), hex( $2 ), hex( $3 ) ) # PROFILE BLOCK START if ( $new_color =~ /^(..)(..)(..)$/ ); # PROFILE BLOCK STOP $found = 1; } $found = 0 if ( $error ); if ( $found && # PROFILE BLOCK START defined( $r ) && ( 0 <= $r ) && ( $r <= 255 ) && defined( $g ) && ( 0 <= $g ) && ( $g <= 255 ) && defined( $b ) && ( 0 <= $b ) && ( $b <= 255 ) ) { # PROFILE BLOCK STOP if ( wantarray ) { return ( $r, $g, $b ); } else { $color = sprintf( '%1$02x%2$02x%3$02x', $r, $g, $b ); return $color; } } else { if ( wantarray ) { return ( -1, -1, -1 ); } else { return "error"; } } } # ---------------------------------------------------------------------------- # # match_attachment_filename - Matches a line like 'attachment; # filename="" # # $line The line to match # Returns The first match (= "attchment" if found) # The second match (= name of the file if found) # # ---------------------------------------------------------------------------- sub match_attachment_filename { my ( $self, $line ) = @_; $line =~ /\s*(.*);\s*filename=\"(.*)\"/; return ( $1, $2 ); } # ---------------------------------------------------------------------------- # # file_extension - Splits a filename into name and extension # # $filename The filename to split # Returns The name of the file # The extension of the file # # ---------------------------------------------------------------------------- sub file_extension { my ( $self, $filename ) = @_; if ( $filename =~ m/(.*)\.(.*)$/ ) { return ( $1, $2 ); } else { return ( $filename, '' ); } } # ---------------------------------------------------------------------------- # # add_attachment_filename - Adds a file name and extension as pseudo # words attchment_name and attachment_ext # # $filename The filename to add to the list of words # # ---------------------------------------------------------------------------- sub add_attachment_filename { my ( $self, $filename ) = @_; if ( defined( $filename ) && ( $filename ne '' ) ) { print "Add filename $filename\n" if $self->{debug__}; # Decode the filename $filename = $self->decode_string( $filename ); my ( $name, $ext ) = $self->file_extension( $filename ); if ( defined( $name ) && ( $name ne '' ) ) { $self->update_pseudoword( 'mimename', $name, 0, $name ); } if ( defined( $ext ) && ( $ext ne '' ) ) { $self->update_pseudoword( 'mimeextension', $ext, 0, $ext ); } } } # ---------------------------------------------------------------------------- # # handle_disposition - Parses Content-Disposition header to extract filename. # If filename found, at the file name and extension to # the word list # # $params The parameters of the Content-Disposition header # # ---------------------------------------------------------------------------- sub handle_disposition { my ( $self, $params ) = @_; my ( $attachment, $filename ) = $self->match_attachment_filename( $params ); if ( defined( $attachment ) && ( $attachment eq 'attachment' ) ) { $self->add_attachment_filename( $filename ); } } # ---------------------------------------------------------------------------- # # splitline - Escapes characters so a line will print as plain-text # within a HTML document. # # $line The line to escape # $encoding The value of any current encoding scheme # # ---------------------------------------------------------------------------- sub splitline { my ( $self, $line, $encoding ) = @_; $line =~ s/([^\r\n]{100,120} )/$1\r\n/g; $line =~ s/([^ \r\n]{120})/$1\r\n/g; $line =~ s//>/g; if ( $encoding =~ /quoted\-printable/i ) { $line =~ s/=3C/</g; $line =~ s/=3E/>/g; } $line =~ s/\t/    /g; return $line; } # GETTERS/SETTERS sub first20 { my ( $self ) = @_; return $self->{first20__}; } sub quickmagnets { my ( $self ) = @_; return $self->{quickmagnets__}; } sub mangle { my ( $self, $value ) = @_; $self->{mangle__} = $value; } # ---------------------------------------------------------------------------- # # convert_encoding # # Convert string from one encoding to another # # $string The string to be converted # $from Original encoding # $to The encoding which the string is converted to # $default The default encoding that is used when $from is invalid or not # defined # @candidates Candidate encodings for guessing # ---------------------------------------------------------------------------- sub convert_encoding { my ( $string, $from, $to, $default, @candidates ) = @_; # If the string contains only ascii characters, do nothing. return $string if ( $string =~ /^[\r\n\t\x20-\x7E]*$/ ); require Encode; require Encode::Guess; # First, guess the encoding. my $enc = Encode::Guess::guess_encoding( $string, @candidates ); if ( ref $enc ) { $from = $enc->name; } else { # If guess does not work, check whether $from is valid. if ( !( Encode::resolve_alias( $from ) ) ) { # Use $default as $from when $from is invalid. $from = $default; } } if ( $from ne $to ) { my ( $orig_string ) = $string; # Workaround for Encode::Unicode error bug. eval { no warnings 'utf8'; if ( ref $enc ) { $string = Encode::encode( $to, $enc->decode( $string ) ); } else { Encode::from_to( $string, $from, $to ); } }; $string = $orig_string if ( $@ ); } return $string; } # ---------------------------------------------------------------------------- # # parse_line_with_kakasi # # Parse a line with Kakasi # # Japanese needs to be parsed by language processing filter, "Kakasi" # before it is passed to Bayes classifier because words are not # splitted by spaces. # # $line The line to be parsed # # ---------------------------------------------------------------------------- sub parse_line_with_kakasi { my ( $self, $line ) = @_; # If the line does not contain Japanese characters, do nothing return $line if ( $line =~ /^[\x00-\x7F]*$/ ); # Split Japanese line into words using Kakasi Wakachigaki mode $line = Text::Kakasi::do_kakasi( $line ); return $line; } # ---------------------------------------------------------------------------- # # parse_line_with_mecab # # Parse a line with MeCab # # Split Japanese words by spaces using "MeCab" - Yet Another Part-of-Speech # and Morphological Analyzer. # # $line The line to be parsed # # ---------------------------------------------------------------------------- sub parse_line_with_mecab { my ( $self, $line ) = @_; # If the line does not contain Japanese characters, do nothing return $line if ( $line =~ /^[\x00-\x7F]*$/ ); # Split Japanese line into words using MeCab $line = $self->{nihongo_parser__}{obj_mecab}->parse( $line ); # Remove the unnecessary white spaces $line =~ s/([\x00-\x1f\x21-\x7f]) (?=[\x00-\x1f\x21-\x7f])/$1/g; return $line; } # ---------------------------------------------------------------------------- # # parse_line_with_internal_parser # # Parse a line with an internal perser # # Split characters by kind of the character # # $line The line to be parsed # # ---------------------------------------------------------------------------- sub parse_line_with_internal_parser { my ( $self, $line ) = @_; # If the line does not contain Japanese characters, do nothing return $line if ( $line =~ /^[\x00-\x7F]*$/ ); # Split Japanese line into words by the kind of characters $line =~ s/\G$euc_jp_word/$1 /og; return $line; } # ---------------------------------------------------------------------------- # # init_kakasi # # Open the kanwa dictionary and initialize the parameter of Kakasi. # # ---------------------------------------------------------------------------- sub init_kakasi { # Initialize Kakasi with Wakachigaki mode(-w is passed to # Kakasi as argument). Both input and ouput encoding are # EUC-JP. Text::Kakasi::getopt_argv( 'kakasi', '-w', '-ieuc', '-oeuc' ); } # ---------------------------------------------------------------------------- # # init_mecab # # Create a new parser object of MeCab. # # ---------------------------------------------------------------------------- sub init_mecab { my ( $self ) = @_; # Initialize MeCab (-F %M\s -U %M\s -E \n is passed to MeCab as argument). # Insert white spaces after words. $self->{nihongo_parser__}{obj_mecab} # PROFILE BLOCK START = MeCab::Tagger->new( '-F %M\s -U %M\s -E \n' ); # PROFILE BLOCK STOP } # ---------------------------------------------------------------------------- # # close_kakasi # # Close the kanwa dictionary of Kakasi. # # ---------------------------------------------------------------------------- sub close_kakasi { Text::Kakasi::close_kanwadict(); } # ---------------------------------------------------------------------------- # # close_mecab # # Free the parser object of MeCab. # # ---------------------------------------------------------------------------- sub close_mecab { my ( $self ) = @_; $self->{nihongo_parser__}{obj_mecab} = undef; } # ---------------------------------------------------------------------------- # # setup_nihongo_parser # # Check whether Nihongo (Japanese) parsers are available and setup subroutines. # # $nihongo_parser Nihongo (Japanese) parser to use # ( kakasi / mecab / internal ) # # ---------------------------------------------------------------------------- sub setup_nihongo_parser { my ( $self, $nihongo_parser ) = @_; # If MeCab is installed, use MeCab. if ( $nihongo_parser eq 'mecab' ) { my $has_mecab = 0; foreach my $prefix ( @INC ) { my $realfilename = "$prefix/MeCab.pm"; if ( -f $realfilename ) { $has_mecab = 1; last; } } # If MeCab is not installed, try to use Text::Kakasi. $nihongo_parser = 'kakasi' if ( !$has_mecab ); } # If Text::Kakasi is installed, use Text::Kakasi. if ( $nihongo_parser eq 'kakasi' ) { my $has_kakasi = 0; foreach my $prefix ( @INC ) { my $realfilename = "$prefix/Text/Kakasi.pm"; if ( -f $realfilename ) { $has_kakasi = 1; last; } } # If Kakasi is not installed, use the internal parser. $nihongo_parser = 'internal' if ( !$has_kakasi ); } # Setup perser's subroutines if ( $nihongo_parser eq 'mecab' ) { # Import MeCab module require MeCab; import MeCab; $self->{nihongo_parser__}{init} = \&init_mecab; $self->{nihongo_parser__}{parse} = \&parse_line_with_mecab; $self->{nihongo_parser__}{close} = \&close_mecab; } elsif ( $nihongo_parser eq 'kakasi' ) { # Import Text::Kakasi module require Text::Kakasi; import Text::Kakasi; $self->{nihongo_parser__}{init} = \&init_kakasi; $self->{nihongo_parser__}{parse} = \&parse_line_with_kakasi; $self->{nihongo_parser__}{close} = \&close_kakasi; } else { # Require no external modules $self->{nihongo_parser__}{init} = sub { }; # Needs no initialization $self->{nihongo_parser__}{parse} = \&parse_line_with_internal_parser; $self->{nihongo_parser__}{close} = sub { }; } return $nihongo_parser; } 1; popfile-1.1.3+dfsg/Classifier/WordMangle.pm0000664000175000017500000001415111710356074020034 0ustar danieldaniel# POPFILE LOADABLE MODULE package Classifier::WordMangle; use POPFile::Module; @ISA = ("POPFile::Module"); # ---------------------------------------------------------------------------- # # WordMangle.pm --- Mangle words for better classification # # Copyright (c) 2001-2011 John Graham-Cumming # # This file is part of POPFile # # POPFile is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # # POPFile is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with POPFile; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ---------------------------------------------------------------------------- use strict; use warnings; use locale; # These are used for Japanese support my $ascii = '[\x00-\x7F]'; # ASCII chars my $two_bytes_euc_jp = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2bytes EUC-JP chars my $three_bytes_euc_jp = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3bytes EUC-JP chars my $euc_jp = "(?:$ascii|$two_bytes_euc_jp|$three_bytes_euc_jp)"; # EUC-JP chars #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); $self->{stop__} = {}; bless $self, $type; $self->name( 'wordmangle' ); return $self; } sub start { my ( $self ) = @_; $self->load_stopwords(); return 1; } # ---------------------------------------------------------------------------- # # load_stopwords, save_stopwords - load and save the stop word list in the stopwords file # # ---------------------------------------------------------------------------- sub load_stopwords { my ($self) = @_; if ( open STOPS, '<' . $self->get_user_path_( 'stopwords' ) ) { delete $self->{stop__}; while ( ) { s/[\r\n]//g; $self->{stop__}{$_} = 1; } close STOPS; } else { $self->log_( 0, "Failed to open stopwords file" ); } } sub save_stopwords { my ($self) = @_; if ( open STOPS, '>' . $self->get_user_path_( 'stopwords' ) ) { for my $word (keys %{$self->{stop__}}) { print STOPS "$word\n"; } close STOPS; } } # ---------------------------------------------------------------------------- # # mangle # # Mangles a word into either the empty string to indicate that the word should be ignored # or the canonical form # # $word The word to either mangle into a nice form, or return empty string if this word # is to be ignored # $allow_colon Set to any value allows : inside a word, this is used when mangle is used # while loading the corpus in Bayes.pm but is not used anywhere else, the colon # is used as a separator to indicate special words found in certain lines # of the mail header # # $ignore_stops If defined ignores the stop word list # # ---------------------------------------------------------------------------- sub mangle { my ($self, $word, $allow_colon, $ignore_stops) = @_; # All words are treated as lowercase my $lcword = lc($word); return '' unless $lcword; # Stop words are ignored return '' if ( ( ( $self->{stop__}{$lcword} ) || # PROFILE BLOCK START ( $self->{stop__}{$word} ) ) && ( !defined( $ignore_stops ) ) ); # PROFILE BLOCK STOP # Remove characters that would mess up a Perl regexp and replace with . $lcword =~ s/(\+|\/|\?|\*|\||\(|\)|\[|\]|\{|\}|\^|\$|\.|\\)/\./g; # Long words are ignored also return '' if ( length($lcword) > 45 ); # Ditch long hex numbers return '' if ( $lcword =~ /^[A-F0-9]{8,}$/i ); # Colons are forbidden inside words, we should never get passed a word # with a colon in it here, but if we do then we strip the colon. The colon # is used as a separator between a special identifier and a word, see MailParse.pm # for more details $lcword =~ s/://g if ( !defined( $allow_colon ) ); return ($lcword =~ /:/ )?$word:$lcword; } # ---------------------------------------------------------------------------- # # add_stopword, remove_stopword # # Adds or removes a stop word # # $stopword The word to add or remove # $lang The current language # # Returns 1 if successful, or 0 for a bad stop word # ---------------------------------------------------------------------------- sub add_stopword { my ( $self, $stopword, $lang ) = @_; # In Japanese mode, reject non EUC Japanese characters. if ( $lang eq 'Nihongo') { if ( $stopword !~ /^($euc_jp)+$/o ) { return 0; } } else { if ( ( $stopword !~ /:/ ) && ( $stopword =~ /[^[:alpha:]\-_\.\@0-9]/i ) ) { return 0; } } $stopword = $self->mangle( $stopword, 1, 1 ); if ( $stopword ne '' ) { $self->{stop__}{$stopword} = 1; $self->save_stopwords(); return 1; } return 0; } sub remove_stopword { my ( $self, $stopword, $lang ) = @_; # In Japanese mode, reject non EUC Japanese characters. if ( $lang eq 'Nihongo') { if ( $stopword !~ /^($euc_jp)+$/o ) { return 0; } } else { if ( ( $stopword !~ /:/ ) && ( $stopword =~ /[^[:alpha:]\-_\.\@0-9]/i ) ) { return 0; } } $stopword = $self->mangle( $stopword, 1, 1 ); if ( $stopword ne '' ) { delete $self->{stop__}{$stopword}; $self->save_stopwords(); return 1; } return 0; } # GETTER/SETTERS sub stopwords { my ( $self, $value ) = @_; if ( defined( $value ) ) { %{$self->{stop__}} = %{$value}; } return keys %{$self->{stop__}}; } 1; popfile-1.1.3+dfsg/Classifier/popfile.sql0000664000175000017500000005227011624177324017625 0ustar danieldaniel-- POPFILE SCHEMA 3 -- --------------------------------------------------------------------------- -- -- popfile.schema - POPFile's database schema -- -- Copyright (c) 2001-2011 John Graham-Cumming -- -- This file is part of POPFile -- -- POPFile is free software; you can redistribute it and/or modify it -- under the terms of version 2 of the GNU General Public License as -- published by the Free Software Foundation. -- -- POPFile is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with POPFile; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- --------------------------------------------------------------------------- -- An ASCII ERD (you might like to find the 'users' table first and work -- from there) -- -- +---------------+ +-----------------+ -- | user_template | | bucket_template | -- +---------------+ +-----------------+ -- | id |-----+ | id |---+ -- | name | | | name | | -- | def | | | def | | -- +---------------+ | +-----------------+ | -- | | -- +---------------+ | +---------------+ | -- | user_params | | | bucket_params | | -- +---------------+ | +---------------+ | -- | id | | | id | | -- +---| userid | | +---| bucketid | | -- | | utid |-----+ | | btid |---+ -- | | val | | | val | -- | +---------------+ | +---------------+ -- | | +----------+ -- | | | matrix | +-------+ -- | | +---------+ +----------+ | words | -- | +----------+ | | buckets | | id | +-------+ -- | | users | | +---------+ | wordid |---| id | -- | +----------+ /--+---| id |=====---| bucketid | | word | -- +----==| id |-----(-------| userid | \ | times | +-------+ -- / | name | | | name | | | lastseen | -- | | password | | | pseudo | | +----------+ -- | +----------+ | +---------+ | -- | | | -- | | +-----------+ | -- | | | magnets | | -- | +------------+ | +-----------+ | +--------------+ -- | | history | | +--| id | | | magnet_types | -- | +------------+ | | | bucketid |--+ +--------------+ -- | | id | | | | mtid |--------| id | -- +---| userid | | | | val | | mtype | -- | hdr_from | | | | seq | | header | -- | hdr_to | | | +-----------+ +--------------+ -- | hdr_cc | | | -- | hdr_subject| | | -- | bucketid |--+ | -- | usedtobe |--/ | -- | magnetid |--------+ -- | hdr_date | -- | inserted | -- | hash | -- | committed | -- | sort_from | -- | sort_cc | -- | sort_to | -- | size | -- +------------+ -- -- TABLE DEFINITIONS -- --------------------------------------------------------------------------- -- -- popfile - data about the database -- -- --------------------------------------------------------------------------- create table popfile ( id integer primary key, version integer -- version number of this schema ); -- --------------------------------------------------------------------------- -- -- users - the table that stores the names and password of POPFile users -- -- v0.21.0: With this release POPFile does not have an internal concept of -- 'user' and hence this table consists of a single user called 'admin', once -- we do the full multi-user release of POPFile this table will be used and -- there will be suitable APIs and UI to modify it -- -- --------------------------------------------------------------------------- create table users ( id integer primary key, -- unique ID for this user name varchar(255), -- textual name of the user password varchar(255), -- user's password unique (name) -- the user name must be unique ); -- --------------------------------------------------------------------------- -- -- buckets - the table that stores the name of POPFile buckets and relates -- them to users. -- -- Note: A single user may have multiple buckets, but a single bucket only has -- one user. Hence there is a many-to-one relationship from buckets to users. -- -- --------------------------------------------------------------------------- create table buckets( id integer primary key, -- unique ID for this bucket userid integer, -- corresponds to an entry in -- the users table name varchar(255), -- the name of the bucket pseudo int, -- 1 if this is a pseudobucket -- (i.e. one POPFile uses -- internally) unique (userid,name) -- a user can't have two buckets -- with the same name ); -- --------------------------------------------------------------------------- -- -- words - the table that creates a unique ID for a word. -- -- Words and buckets come together in the matrix table to form the corpus of -- words for each user. -- -- --------------------------------------------------------------------------- create table words( id integer primary key, -- unique ID for this word word varchar(255), -- the word unique (word) -- each word is unique ); -- --------------------------------------------------------------------------- -- -- matrix - the corpus that consists of buckets filled with words. Each word -- in each bucket has a word count. -- -- --------------------------------------------------------------------------- create table matrix( id integer primary key, -- unique ID for this entry wordid integer, -- an ID in the words table bucketid integer, -- an ID in the buckets table times integer, -- number of times the word has -- been seen lastseen date, -- last time the record was read -- or written unique (wordid, bucketid) -- each word appears once in a -- bucket ); -- --------------------------------------------------------------------------- -- -- user_template - the table of possible parameters that a user can have. -- -- For example in the users table there is just an password associated with -- the user. This table provides a flexible way of creating per user -- parameters. It stores the definition of the parameters and the the -- user_params table relates an actual user with each parameter -- -- --------------------------------------------------------------------------- create table user_template( id integer primary key, -- unique ID for this entry name varchar(255), -- the name of the -- parameter def varchar(255), -- the default value for -- the parameter unique (name) -- parameter name's are -- unique ); -- --------------------------------------------------------------------------- -- -- user_params - the table that relates users with user parameters (as defined -- in user_template) and specific values. -- -- --------------------------------------------------------------------------- create table user_params( id integer primary key, -- unique ID for this -- entry userid integer, -- a user utid integer, -- points to an entry in -- user_template val varchar(255), -- value for the -- parameter unique (userid, utid) -- each user has just one -- instance of each parameter ); -- --------------------------------------------------------------------------- -- -- bucket_template - the table of possible parameters that a bucket can have. -- -- See commentary for user_template for an explanation of the philosophy -- -- --------------------------------------------------------------------------- create table bucket_template( id integer primary key, -- unique ID for this -- entry name varchar(255), -- the name of the -- parameter def varchar(255), -- the default value for -- the parameter unique (name) -- parameter names -- are unique ); -- --------------------------------------------------------------------------- -- -- bucket_params - the table that relates buckets with bucket parameters -- (as defined in bucket_template) and specific values. -- -- --------------------------------------------------------------------------- create table bucket_params( id integer primary key, -- unique ID for this -- entry bucketid integer, -- a bucket btid integer, -- points to an entry in -- bucket_template val varchar(255), -- value for the -- parameter unique (bucketid, btid) -- each bucket has just -- one instance of each -- parameter ); -- --------------------------------------------------------------------------- -- -- magnet_types - the types of possible magnet and their associated header -- -- --------------------------------------------------------------------------- create table magnet_types( id integer primary key, -- unique ID for this entry mtype varchar(255), -- the type of magnet -- (e.g. from) header varchar(255), -- the header (e.g. From) unique (mtype) -- types are unique ); -- --------------------------------------------------------------------------- -- -- magnets - relates specific buckets to specific magnet types with actual -- magnet values -- -- --------------------------------------------------------------------------- create table magnets( id integer primary key, -- unique ID for this entry bucketid integer, -- a bucket mtid integer, -- the magnet type val varchar(255), -- value for the magnet comment varchar(255), -- user defined comment seq integer -- used to set the order of -- magnets ); -- --------------------------------------------------------------------------- -- -- history - this table contains the items in the POPFile history that -- are managed by POPFile::History -- -- --------------------------------------------------------------------------- create table history( id integer primary key, -- unique ID for this entry userid integer, -- which user owns this committed integer, -- 1 if this item has been -- committed hdr_from varchar(255), -- The From: header hdr_to varchar(255), -- The To: header hdr_cc varchar(255), -- The Cc: header hdr_subject varchar(255), -- The Subject: header hdr_date date, -- The Date: header hash varchar(255), -- MD5 message hash inserted date, -- When this was added bucketid integer, -- Current classification usedtobe integer, -- Previous classification magnetid integer, -- If classified with magnet sort_from varchar(255), -- The From: header sort_to varchar(255), -- The To: header sort_cc varchar(255), -- The Cc: header size integer -- Size of the message (bytes) ); -- MySQL SPECIFIC -- --------------------------------------------------------------------------- -- -- NOTE: The following alter table statements are required by MySQL in order -- to get the ID fields to auto_increment on inserts. -- -- --------------------------------------------------------------------------- alter table buckets modify id int(11) auto_increment; alter table bucket_params modify id int(11) auto_increment; alter table bucket_template modify id int(11) auto_increment; alter table magnets modify id int(11) auto_increment; alter table magnet_types modify id int(11) auto_increment; alter table matrix modify id int(11) auto_increment; alter table user_params modify id int(11) auto_increment; alter table user_template modify id int(11) auto_increment; alter table users modify id int(11) auto_increment; alter table words modify id int(11) auto_increment; alter table history modify id int(11) auto_increment; alter table popfile modify id int(11) auto_increment; -- MySQL treats char fields as case insensitive for searches, in order to have -- the same behavior as SQLite (case sensitive searches) we alter the word.word -- field to binary, that will trick MySQL into treating it the way we want. alter table words modify word binary(255); -- MySQL enforces types, SQLite uses the concept of manifest typing, where -- the type of a value is associated with the value itself, not the column that -- it is stored in. POPFile has two date fields in history where POPFile -- is actually storing the unix time not a date. MySQL interprets the -- unix time as a date of 0000-00-00, whereas SQLite simply stores the -- unix time integer. The follow alter table statements redefine those -- date fields as integer for MySQL so the correct behavior is obtained -- for POPFile's use of the fields. alter table history modify hdr_date int(11); alter table history modify inserted int(11); -- TRIGGERS -- --------------------------------------------------------------------------- -- -- delete_bucket - if a/some bucket(s) are delete then this trigger ensures -- that entries the hang off the bucket table are also deleted -- -- It deletes the related entries in the 'matrix', 'bucket_params' and -- 'magnets' tables. -- -- --------------------------------------------------------------------------- create trigger delete_bucket delete on buckets begin delete from matrix where bucketid = old.id; delete from history where bucketid = old.id; delete from magnets where bucketid = old.id; delete from bucket_params where bucketid = old.id; end; -- --------------------------------------------------------------------------- -- -- delete_user - deletes entries that are related to a user -- -- It deletes the related entries in the 'matrix' and 'user_params'. -- -- --------------------------------------------------------------------------- create trigger delete_user delete on users begin delete from history where userid = old.id; delete from buckets where userid = old.id; delete from user_params where userid = old.id; end; -- --------------------------------------------------------------------------- -- -- delete_magnet_type - handles the removal of a magnet type (this should be a -- very rare thing) -- -- --------------------------------------------------------------------------- create trigger delete_magnet_type delete on magnet_types begin delete from magnets where mtid = old.id; end; -- --------------------------------------------------------------------------- -- -- delete_user_template - handles the removal of a type of user parameters -- -- --------------------------------------------------------------------------- create trigger delete_user_template delete on user_template begin delete from user_params where utid = old.id; end; -- --------------------------------------------------------------------------- -- -- delete_bucket_template - handles the removal of a type of bucket parameters -- -- --------------------------------------------------------------------------- create trigger delete_bucket_template delete on bucket_template begin delete from bucket_params where btid = old.id; end; -- Default data -- This is schema version 3 insert into popfile ( version ) values ( 3 ); -- There's always a user called 'admin' insert into users ( name, password ) values ( 'admin', 'e11f180f4a31d8caface8e62994abfaf' ); insert into magnets ( id, bucketid, mtid, val, comment, seq ) values ( 0, 0, 0, '', '', 0 ); -- These are the possible parameters for a bucket -- -- subject 1 if should do subject modification for message classified -- to this bucket -- xtc 1 if should add X-Text-Classification header -- xpl 1 if should add X-POPFile-Link header -- fncount Number of messages that were incorrectly classified, and -- meant to go into this bucket but did not -- fpcount Number of messages that were incorrectly classified into -- this bucket -- quarantine 1 if should quaratine (i.e. RFC822 wrap) messages in this -- bucket -- count Total number of messages classified into this bucket -- color The color used for this bucket in the UI insert into bucket_template ( name, def ) values ( 'subject', '1' ); insert into bucket_template ( name, def ) values ( 'xtc', '1' ); insert into bucket_template ( name, def ) values ( 'xpl', '1' ); insert into bucket_template ( name, def ) values ( 'fncount', '0' ); insert into bucket_template ( name, def ) values ( 'fpcount', '0' ); insert into bucket_template ( name, def ) values ( 'quarantine', '0' ); insert into bucket_template ( name, def ) values ( 'count', '0' ); insert into bucket_template ( name, def ) values ( 'color', 'black' ); -- The possible magnet types insert into magnet_types ( mtype, header ) values ( 'from', 'From' ); insert into magnet_types ( mtype, header ) values ( 'to', 'To' ); insert into magnet_types ( mtype, header ) values ( 'subject', 'Subject' ); insert into magnet_types ( mtype, header ) values ( 'cc', 'Cc' ); -- There's always a bucket called 'unclassified' which is where POPFile puts -- messages that it isn't sure about. insert into buckets ( name, pseudo, userid ) values ( 'unclassified', 1, 1 ); -- MySQL insists that auto_increment fields start at 1. POPFile requires -- a special magnet record with an id of 0 in order to work properly. -- The following SQL statement will fix the inserted special record -- on MySQL installs so the id is 0, the statement should do nothing -- on SQLite installs since it will not satisfy the where clause. update magnets set id = 0 where id = 1 and (bucketid = 0 and mtid = 0); -- END popfile-1.1.3+dfsg/black.gif0000664000175000017500000000005311624177332015114 0ustar danieldanielGIF89aタタタ!,L;